【问题标题】:Will main() catch exceptions thrown from threads?main() 会捕获线程抛出的异常吗?
【发布时间】:2011-12-05 12:59:28
【问题描述】:
我有一个非常大的应用程序,它可以动态加载共享对象并在共享对象中执行代码。作为预防措施,我对main 中的几乎所有内容都进行了尝试/捕捉。我为 3 件事创建了一个捕获:myException(内部异常)、std::exception 和 ...(捕获所有异常)。
作为共享对象执行的一部分,会创建许多pthreads。当一个线程抛出异常时,它不会被main 捕获。这是标准行为吗?如何捕获所有异常,无论它们是从哪个线程抛出的?
【问题讨论】:
标签:
c++
exception-handling
pthreads
【解决方案2】:
您的问题是在要求一些概念上不可能的东西。
Try 块被定义为堆栈的动态结构。 try 块从其内容中捕获由调用动态到达的代码引发的异常。
当您创建一个新线程时,您会创建一个全新的堆栈,它根本不是 try 块的动态上下文的一部分,即使对 pthread_create 的调用在 try 中也是如此。
【解决方案3】:
不,main 不会捕获从其他线程抛出的异常。您需要使用非标准的、特定于平台的工具来处理未处理的异常,以便按照您描述的方式聚合处理。
当我构建这样的应用程序时,我确保每个活动对象都有自己的顶级异常处理块,以防止在一个线程失败时整个应用程序爆炸。我认为使用特定于平台的捕获所有内容都要求您的整体代码/解决方案草率。我不会用这样的东西。
【解决方案4】:
考虑抛出异常会展开堆栈。每个线程都有自己的堆栈。您必须在每个线程函数中放置一个 try/catch 块(即在每个线程的入口点)。