c++ - 异常(exception):错误的输出

标签 c++ exception

int At(int i, int j) const {
    try {
        if (i >= m.size() || j >= m[0].size())
            throw out_of_range("out_of_range");
        return m.at(i).at(j);
    }
    catch (exception& e) {
        cout << e.what() << endl;
    }
}

int& At(int i, int j) {
    try {
        if (i >= m.size() || j >= m[0].size())
            throw out_of_range("out_of_range");
        return m.at(i).at(j);
    }
    catch (exception& e) {
        cout << e.what() << endl;
    }
}

int main() {
Matrix one, two(2, 3);
cout << two;
one.Reset(0, 0);
cout << one.At(4, 4);
return 0;
}
在此代码中必须打印出异常:out_of_range,但对我而言是:
超出范围
-244281
这个数字是什么?如何从输出中删除它?

最佳答案

如果抛出异常,则catch处理程序将打印消息("out_of_range"),然后该函数继续运行,就像什么也没有发生一样。
问题在于,这种“继续运行”会导致函数结束而无需返回任何内容,从而在尝试打印此非返回值时导致未定义的行为。
如果声明一个函数以返回任何内容,则必须返回一些内容。

话虽如此,在At函数中捕获异常没有任何意义。并且考虑到其中一个变体返回引用,因此很难返回“值”,因为您不能拥有“空”引用。
解决的办法是在函数中完全不使用try-catch,而是让函数的调用者处理任何可能的异常。

关于c++ - 异常(exception):错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63766670/

相关文章:

C++:重定向 STDOUT

c++ - 如何将文件嵌入到可执行文件中?

c++ - COMDAT 部分的用途是什么?

c++ - 模板函数中 const 引用的类型推导

wpf - 捕获未处理的异常后应用程序仍然崩溃

c++ - 内联汇编中的 sse 约束不起作用

c# - 实现接口(interface)时是否需要处理已记录异常的引发

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

java - 使用Struts验证框架的错误处理问题

c# - 防止从 BeginInvoke 抛出时丢弃外部异常