C++ 捕获所有错误

C++ 捕获所有错误,c++,exception,C++,Exception,在我的程序中,我想捕捉函数中的每个错误。我尝试过使用try/catch,但程序仍然存在。我已经树立了一个我想要抓住的例子 #include <iostream> #include <stack> using namespace std; int main() { stack<string> test; test.push("lel"); try { test.pop(); test.pop();

在我的程序中,我想捕捉函数中的每个错误。我尝试过使用try/catch,但程序仍然存在。我已经树立了一个我想要抓住的例子

#include <iostream>
#include <stack>

using namespace std;

int main()
{
    stack<string> test;
    test.push("lel");
    try {
        test.pop();
        test.pop();
    }
    catch (...) {
        cout << "Caught" << endl;
    }
    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
堆栈测试;
测试推送(“lel”);
试一试{
test.pop();
test.pop();
}
捕获(…){
当堆栈为空时,cout
stack::pop()
不会引发任何
异常
。相反,从空堆栈中弹出是未定义的行为。因为没有引发异常,所以您的
catch
子句不能捕捉任何内容,而会终止程序(在UB中可能发生任何事情)

因此,关于捕获所有错误的意图,我认为在
main
中放置一个
try catch
,以捕获从任何其他位置逃逸的任何内容是一个很好的做法,如果实际抛出异常,您应该能够捕获。请注意一些问题:

  • 如果出现任何UB,控件可能无法到达
    catch
    块中
  • C++不能同时处理多个异常,在这种情况下,程序很可能在发生异常的地方终止(特别要小心,这样异常就不会留下任何析构函数)
  • 正在引发不在函数异常规范列表中的异常(程序很可能会终止)
  • stack::pop()
    当堆栈为空时,不会引发任何
    异常
    。相反,从空堆栈中弹出是未定义的行为。由于没有引发异常,因此您的
    catch
    子句无法捕获任何内容,而会终止程序(在UB中可能发生任何事情)

    因此,关于捕获所有错误的意图,我认为在
    main
    中放置一个
    try catch
    ,以捕获从任何其他位置逃逸的任何内容是一个很好的做法,如果实际抛出异常,您应该能够捕获。请注意一些问题:

  • 如果出现任何UB,控件可能无法到达
    catch
    块中
  • C++不能同时处理多个异常,在这种情况下,程序很可能在发生异常的地方终止(特别要小心,这样异常就不会留下任何析构函数)
  • 正在引发不在函数异常规范列表中的异常(程序很可能会终止)

  • std::stack::pop
    函数由C11++§23.6.5.2定义为

    void pop() { c.pop_back(); }
    
    C++11§23.2.3/16中的表101对调用
    pop_pack
    提出了以下要求:

    要求:
    a.empty()
    应为
    false

    这意味着在空堆栈上调用
    pop
    会破坏函数的约定,因此具有未定义的行为


    没有一种可移植的方法来检测这个效果,不管它是C++实现还是程序的特定运行。但是,对于给定的C++实现,它可以更明确地定义,并且您可以捕获它。

    <代码>:ST:::POP:<代码>函数由C11++PAR.23.5.5.2定义为

    void pop() { c.pop_back(); }
    
    C++11§23.2.3/16中的表101对调用
    pop_pack
    提出了以下要求:

    要求:
    a.empty()
    应为
    false

    这意味着在空堆栈上调用
    pop
    会破坏函数的约定,因此具有未定义的行为


    没有任何方法来检测效果,不管它是C++实现和程序的特定运行。但是,对于给定的C++实现,它可以更明确地定义,并且您可以捕获它。

    catch意味着异常将由最内层处理块处理,并不意味着y。我们的程序永远不会恢复执行(除非操作系统处理异常并做出决定)@Rakibul的回答描述了为什么这不起作用。相反,你可以在每次
    pop()之前检查
    用于空容器,或者如果您在空容器时尝试
    弹出
    ,则使用另一种容器类型引发
    异常。捕获意味着异常将由最内部的处理块处理,但并不意味着您的程序将永远不会恢复执行(除非操作系统处理异常并决定这样做)@Rakibul的回答描述了为什么这不起作用。相反,您可以在每次
    pop()之前检查
    用于空容器,或者使用另一种容器类型,如果您在空容器时尝试
    pop
    则会引发异常。我同意,这就是为什么没有执行catch子句的原因。+1我同意,这就是为什么没有执行catch子句的原因。+1