是的,这是个好主意。
如果你让一个异常逃逸 main 它是实现定义的天气堆栈在应用程序关闭之前展开。所以在我看来,你必须在 main 中捕获所有异常。
那么问题就变成了如何处理它们。
某些操作系统(请参阅 MS 和 SE)提供了一些额外的调试工具,因此在捕获异常后重新抛出异常很有用(因为无论如何现在堆栈已经展开)。
int main()
{
try
{
/// All real code
}
// I see little point in catching other exceptions at this point
// (apart from better logging maybe). If the exception could have been caught
// and fixed you should have done it before here.
catch(std::exception const& e)
{
// Log e.what() Slightly better error message than ...
throw;
}
catch(...) // Catch all exceptions. Force the stack to unwind correctly.
{
// You may want to log something it seems polite.
throw; // Re-throw the exception so OS gives you a debug opportunity.
}
}
它应该对线程没有影响。通常您必须手动加入任何子线程以确保它们已退出。没有很好地定义主退出时子线程会发生什么的确切细节(因此请阅读您的文档),但通常所有子线程都会立即死亡(不涉及展开其堆栈的令人讨厌和可怕的死亡)。
如果您在谈论子线程中的异常。同样,这没有很好的定义(因此请阅读您的文档),但是如果线程通过异常退出(即用于启动线程的函数由于异常而不是返回而退出),那么这通常会导致应用程序终止(同样的影响如上)。所以最好总是阻止所有异常退出线程。
信号不受异常处理机制的影响。
但是因为信号处理程序可能会在堆栈上放置一个奇怪的结构(为了他们自己的返回处理返回到正常代码),所以从信号处理程序中抛出异常不是一个好主意,因为这可能会导致意外结果(并且绝对不可移植)。
- 它不会影响不可避免地嵌套在其中的其他 try...catch 块,它们可以处理预期的异常吗?
应该对其他处理程序没有影响。