【发布时间】:2010-11-02 03:45:48
【问题描述】:
在 C++ 中,throw; 在 catch 块内执行时会在块外重新抛出当前捕获的异常。
在this answer 中,提出了一个异常调度器的想法,作为在经常使用复杂异常处理时减少代码重复的解决方案:
try {
CodeThatMightThrow();
} catch(...) {
ExceptionHandler();
}
void ExceptionHandler()
{
try {
throw;
} catch( FileException* e ) {
//do handling with some complex logic
delete e;
} catch( GenericException* e ) {
//do handling with other complex logic
delete e;
}
}
抛出一个指针或一个值没有任何区别,所以这是不可能的。
如果不是从 catch 块调用 ExceptionHandler() 会发生什么?
我用 VC7 试过这段代码:
int main( int, char** )
{
try {
throw;
} catch( ... ) {
MessageBox( 0, "", "", 0 );
}
return 0;
}
首先它使调试器指示第一次机会异常,然后立即指示未处理的异常。如果我在调试器之外运行此代码,程序崩溃的方式与调用 abort() 的方式相同。
这种情况下的预期行为是什么?
【问题讨论】:
-
删除了“windows”标签,因为这与 Windows 无关(但这是一个好问题)。
标签: c++ exception visual-c++ exception-handling