另一个问题中的某人建议使用catch(...)
捕获所有其他未处理的-意外的/无法预见的异常,方法是将整个main()
包围在try{}catch(...){}
块中。
听起来这是一个有趣的想法,可以节省大量调试程序的时间,并且至少可以提示发生了什么。
问题的实质是可以通过来恢复哪些信息(除了我留下的任何调试全局变量之外),以及如何来恢复它(如何访问和识别调用了什么捕获方法)
此外,还有一些注意事项。特别是:
最佳答案
是的,这是一个好主意。
如果让异常转义为主要,则是在实现定义的情况下,在应用程序关闭之前先将堆栈解开。因此,我认为重要的是您必须捕获所有异常(exception)。
问题就变成了如何处理它们。
某些OS(请参阅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.
}
}
它应该对线程没有影响。通常,您必须手动加入所有子线程以确保它们已退出。当主导出退出时,子线程发生了什么的确切详细信息(请仔细阅读您的文档),但是通常所有子线程都会立即死亡(一个令人讨厌的可怕死亡,并不涉及取消其堆栈)。
如果您正在谈论子线程中的异常。再次定义得不好(请阅读您的文档),但是如果线程通过异常退出(即用于启动线程的函数由于异常而不是返回而退出),则通常会导致应用程序终止(影响相同)如上)。因此,始终最好阻止所有异常退出线程。
信号不受异常处理机制的影响。
但是由于信号处理程序可能在堆栈上放置一个奇怪的结构(用于自己的返回处理,以返回普通代码),所以从信号处理程序中引发异常不是一个好主意,因为这可能会导致意外结果(并且绝对不可移植) )。
应该对其他处理程序没有影响。
关于c++ - 使用catch(…)(省略号)进行事后分析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2183113/