C++ main()会捕获线程抛出的异常吗?

C++ main()会捕获线程抛出的异常吗?,c++,exception-handling,pthreads,C++,Exception Handling,Pthreads,我有一个相当大的应用程序,它动态加载共享对象并在共享对象中执行代码。作为预防措施,我对main中的几乎所有内容都进行了尝试/捕获。我为三件事创建了一个catch:myException(内部异常)、std::exception,以及…(捕获所有异常) 作为共享对象执行的一部分,会创建许多pthread。当线程抛出异常时,它不会被main捕获。这是标准行为吗?如何捕获所有异常,无论它们是从哪个线程抛出的 main()会捕获线程抛出的异常吗 没有 当线程抛出异常时,它不会被main捕获。这是标准行为

我有一个相当大的应用程序,它动态加载共享对象并在共享对象中执行代码。作为预防措施,我对
main
中的几乎所有内容都进行了尝试/捕获。我为三件事创建了一个catch:
myException
(内部异常)、
std::exception
,以及
(捕获所有异常)

作为共享对象执行的一部分,会创建许多
pthread
。当线程抛出异常时,它不会被
main
捕获。这是标准行为吗?如何捕获所有异常,无论它们是从哪个线程抛出的

main()会捕获线程抛出的异常吗

没有

当线程抛出异常时,它不会被main捕获。这是标准行为吗

是的,这是标准行为

要捕获源自thread
X
的异常,必须在thread
X
中使用
try
-
catch
子句(例如,线程函数中的所有内容,类似于您在
main
中已经执行的操作)


有关相关问题,请参见

否,main不会捕获从其他线程引发的异常。您需要使用非标准的、特定于平台的工具来处理未处理的异常,以便按照您描述的方式聚合处理


当我构建这样的应用程序时,我确保每个活动对象都有自己的顶级异常处理块,以防止在一个线程失败时整个应用程序崩溃。我认为,使用特定于平台的“包罗万象”会让您的总体代码/解决方案显得马虎。我不会使用这样的东西。

考虑一下抛出异常会解除堆栈。每个线程都有自己的堆栈。您必须在每个线程函数(即每个线程的入口点)中放置一个try/catch块。

您的问题是询问一些概念上不可能的问题

Try块定义为堆栈的动态构造。try块捕获通过调用从其内容动态到达的代码引发的异常

当您创建一个新线程时,您将创建一个全新的堆栈,该堆栈根本不是try块的动态上下文的一部分,即使对pthread_create的调用在try中也是如此