【发布时间】:2017-11-26 04:41:06
【问题描述】:
所以我在模板类中有这个函数:
T getValue(int x, int y) const throw(logic_error, out_of_range) { // value getter
try {
if (x > rows || y > cols || x <= 0 || y <= 0)
throw out_of_range("Invalid x or y.");
else
return data[cols*(x-1)+(y-1)];
} catch (out_of_range& e) {
cerr << e.what() << endl;
}
}
如果我尝试给它一个超出范围的数字,异常会起作用,但输出总是:
Invalid x or y.
1
我已经尝试了一个小时来弄清楚那个 1 是从哪里来的,我到底想念什么?它当然与 std::out_of_range 有关系,但我不知道究竟是什么。
编辑这是关于模板矩阵的:
Matrix<int> a(2, 2, 0); // creates a 2x2 matrix of all zeros
cout << a.getValue(3, 2) << endl; // prints the value at row 3, col 2, which doesn't actually exists; the output is as shown above
另外,值得注意的是
int b = a.getValue(3, 2);
给出预期的输出:
Invalid x or y.
【问题讨论】:
-
在
getValue的右大括号之前添加return 3;并再次运行代码。这应该清楚发生了什么。 -
做到了;输出中的数字现在是 3,所以我得到的 1 是一种流氓返回值。为什么我会这样?如果函数无法继续,异常是否应该帮助我避免返回任何值?
-
@Zelethil -- 代码捕获了异常。在 catch 子句之后继续正常执行。而且,是的,1 是一种流氓返回值。运行应该返回值的函数的末尾会产生未定义的行为。在实践中,您最终会看到寄存器中的任何值都发生在预期返回值的位置。
-
好的,我明白了;我该如何解决这个问题?有人告诉我,使用异常可以帮助我避免返回值,但是如果函数返回了一些东西,我应该如何不返回任何值?
-
不要捕获异常,或者捕获它并重新抛出它。但最重要的是,找到一本好的教科书。这是基本的东西,你不会通过随机实验来学习它。
标签: c++ exception try-catch throw