【问题标题】:std::out_of_range exception weird outputstd::out_of_range 异常奇怪的输出
【发布时间】: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


【解决方案1】:

通过添加解决它

exit(-1);

到 catch 块:

catch (out_of_range &e) {
   cerr << e.what() << endl;
   exit(-1);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多