这些天来,我一直在阅读C++ F.A.Q,特别是this page。
通过阅读本节,我发现了一种“技术”,作者称之为“异常调度程序”,允许某人将所有异常处理分组到一个方便的函数中:
void handleException()
{
try {
throw; // ?!
}
catch (MyException& e) {
//...code to handle MyException...
}
catch (YourException& e) {
//...code to handle YourException...
}
}
void f()
{
try {
//...something that might throw...
}
catch (...) {
handleException();
}
}
令我困扰的是单throw;
语句:如果你考虑给定的例子然后肯定,它显然是做什么的:它重新抛出首先在f()
中捕获的异常并再次处理它。
但是,如果我直接调用handleException()
,而不是从catch()
子句中进行调用,该怎么办?有没有指定的行为?
此外,对于奖励积分,您知道的throw
还有其他“怪异”(可能不是好词)吗?
谢谢。
答案 0 :(得分:45)
如果您自己执行throw;
,并且没有重新抛出的当前异常,则程序突然结束。 (更具体地说,调用terminate()
。)
注意扔;是重新抛出当前异常的唯一安全方法 - 它不等于
catch (exception const & e) { throw e; }
答案 1 :(得分:37)
是的,它指定了行为,它将调用terminate;
15.1,第8段:如果目前没有处理异常,则执行a 抛出没有操作数调用的表达式 terminate()(15.5.1)。
答案 2 :(得分:7)
那就是所谓的异常处理程序。如果有的话,它会重新抛出“当前异常”。如果当前没有处理任何异常terminate()
will be called。