C++ 标准不指定程序在遇到未捕获异常时的行为。在一些系统中,遇到这种情况的结果是显示完整的堆栈跟踪,也就意味着在程序结束之前自动对象会正确地销毁。而在另外一些系统中,未捕获异常会导致程序直接结束,而不会销毁自动对象。
这种回旋余地是不一致的;解决用户需要与供应商需要之间的冲突导致了这一现象的产生。在某些调试环境中,在遇到未捕获异常时避免析构对象是必要的,因为它能够让用户在程序终止之前恢复执行。相反,在一些硬件架构中,如果不同时正确地销毁对象,那么展开堆栈几乎不可能做到。
因为这是一个平台相关的行为,所以程序员就要分析在他们的系统在出现未捕获异常时的行为。更重要的是,如果我们的代码将在运行在多个平台之上,那么我们需要在 main() 函数中使用一个 catch(. . .) 代码块来保证程序行为在不同平台下的一致性。
int main()
{
try
{
f();
}
catch(DerivedEx& d) //handle most derived exception first
{}
catch(BaseEx& e)
{}
catch(...) //no exception is left uncaught
{}
}
这样就保证了不会出现未捕获的异常。
……