另一个问题中的某人建议使用catch(...)捕获所有其他未处理的-意外的/无法预见的异常,方法是将整个main()包围在try{}catch(...){}块中。

听起来这是一个有趣的想法,可以节省大量调试程序的时间,并且至少可以提示发生了什么。

问题的实质是可以通过来恢复哪些信息(除了我留下的任何调试全局变量之外),以及如何来恢复它(如何访问和识别调用了什么捕获方法)

此外,还有一些注意事项。特别是:

  • 与稍后发芽的线程一起使用会很好吗?
  • 不会中断处理段错误(在其他地方作为信号捕获)
  • 会不会影响不可避免地嵌套在其中的其他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/

    10-14 10:54