10

我正在阅读“C++ 编程语言第 4 版”一书,并且对有关异常处理的一段有疑问:

在某些情况下,必须放弃异常处理以使用不太微妙的错误处理技术。指导原则是:

  • 处理异常时不要抛出异常。
  • 不要抛出无法捕获的异常。

如果异常处理实现捕捉到你做任何一个,它会终止你的程序。

有人可以给我一个第一种情况的例子吗?我想到的只有这样的东西,但它是根据 g++ 的有效代码:

try
{
    throw 1;
}
catch(...)
{
    try
    {
        throw 2;
    }
    catch(...)
    {
        cout << "OK";
    }
}
4

1 回答 1

16

这有点误导;只要有另一个处理程序来捕获它,就可以从异常处理程序中抛出(这就是我所理解的“处理异常时”)。

问题是,如果您从堆栈展开期间被销毁的对象的析构函数中抛出异常。那样的话,有两个未处理的异常,通常的异常机制只能处理一个;所以响应是调用terminate

例子:

struct dodgy {~dodgy() {throw "Don't do this!";}};

try {
    dodgy d;
    throw 1;
} catch (...) {
    // Never reached: destroying `d` killed the program.
}
于 2013-07-24T15:49:26.200 回答