微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“try-catch”是否捕获运行时错误尤其是超出范围错误

如何解决“try-catch”是否捕获运行时错误尤其是超出范围错误

我正在遵循使用 C++ 的编程原则和实践中的示例代码,其中一个示例代码显示了此代码片段

int main()
{
    try {
        vector<int> v; // a vector of ints
        for (int x; cin >> x; )
            v.push_back(x); // set values
        for (int i = 0; i <= v.size(); ++i) // print values
            cout << "v[" << i << "] == " << v[i] << '\n';
    }
    catch (const out_of_range& e) {
        cerr << "Oops! Range error\n";
        return 1;
    }
    catch (...) { // catch all other exceptions
        cerr << "Exception: something went wrong\n";
        return 2;
    }
}

据我所知,它应该捕获out_of_range 错误输出“糟糕!范围错误。但是,Visual Studio 2019 显示了这一点。

enter image description here

谁能解释为什么它显示我这个

解决方法

“try-catch”是否捕获运行时错误(尤其是 Out of Range 错误)?

不,在 C++ 中,大多数运行时错误会导致未定义行为,而不是异常。只能捕获显式抛出异常的错误。

std::vector<T>::operator[] 没有指定当您访问越界时它会抛出异常,它只是未定义的行为,任何事情都可能发生。它甚至可以工作。当我在这里尝试时,没有任何可见的错误:https://godbolt.org/z/Pcv9Gn8M9

如果您想要越界访问异常,std::vector<T>::at() 会抛出 std::out_of_range

对于您的测试,您应该使用 v.at(i) 而不是 v[i]。在这里试试:https://godbolt.org/z/szKxhjxhx

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。