我正在阅读“C ++编程语言第4版”一书,并对有关异常处理的段落提出疑问:
有些情况下必须放弃异常处理 微妙的错误处理技术。指导原则是:
- 处理异常时不要抛出异常。
- 不要抛出无法捕获的异常。
如果异常处理实现捕获了你,那么它 将终止您的计划。
有人可以举个例子说明第一次看台吗?我只想到这样的东西,但根据g ++,这是一个有效的代码:
try
{
throw 1;
}
catch(...)
{
try
{
throw 2;
}
catch(...)
{
cout << "OK";
}
}
答案 0 :(得分:14)
这有点误导;可以从异常处理程序抛出(这是我在处理异常时所理解的“),只要有另一个处理程序来捕获它。
问题是如果从堆栈展开期间被销毁的对象的析构函数中抛出异常。在这种情况下,有两个未处理的异常,通常的异常机制只能处理一个;所以回复是致电terminate
。
示例:
struct dodgy {~dodgy() {throw "Don't do this!";}};
try {
dodgy d;
throw 1;
} catch (...) {
// Never reached: destroying `d` killed the program.
}