【问题标题】:Does "try-catch" catches run time error (especially Out of Range error)“try-catch”是否捕获运行时错误(尤其是超出范围错误)
【发布时间】:2021-06-26 17:21:57
【问题描述】:

我正在关注 Programming Principles and Practice Using C++ 中的示例代码,其中一个异常示例显示了代码的 sn-p

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 显示了这一点。

谁能解释一下为什么会显示这个

【问题讨论】:

  • 不要将运行时错误与 c++ 异常混淆。当i 是有效索引并且是未定义的行为时,v[i] 永远不会引发异常
  • 这能回答你的问题吗? stackoverflow.com/questions/16620222/…
  • 那么vector越界时会抛出异常吗?
  • 没有。 v[i] 从不抛出异常,除非 i 越界,那么它就是 undefined behavior。如果你想要一个例外,你应该改用at(i)
  • @AUNG -- 要抛出异常,C++ 代码在使用[ ] 时必须检查向量的边界。通过这样做,代码会变慢,因此程序员会得到他没有要求的东西(边界检查)。依赖速度的关键任务代码将无缘无故减慢速度。如果程序员希望 C++ 检查边界,则使用at()。想象一个游戏程序员说“没有这个边界检查,我的游戏会更快”。如果你是 C++ 程序员,你不会想要这样。

标签: c++ exception visual-c++ try-catch


【解决方案1】:

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

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

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

如果您想在越界访问时出现异常,std::vector&lt;T&gt;::at() 会抛出 std::out_of_range

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2018-09-24
    相关资源
    最近更新 更多