我有一个非常大的应用程序,它动态加载共享对象并在共享对象中执行代码。作为预防措施,我对main
中的几乎所有内容都进行了尝试/捕获。我为3件事创建了一个catch: myException
(一个内部异常)、std::exception
和...
(捕获所有异常)。
作为共享对象执行的一部分,创建了许多pthreads
。当线程抛出异常时,它不会被main
捕获。这是标准行为吗?我如何捕获所有异常,不管它们是从哪个线程抛出的?
没有main()会捕获线程抛出的异常吗?
当线程抛出异常时,它不会被main捕获。这是标准行为吗?
是,这是标准行为。
要捕获线程X
中产生的异常,您必须在线程X
中使用try
- catch
子句(例如,围绕线程函数中的所有内容,类似于您在main
中所做的)。
有关相关问题,请参见如何在线程之间传播异常?
你的问题是在要求一些概念上不可能的事情。
Try块被定义为堆栈的动态构造。try块捕获由调用动态到达的代码从其内容中抛出的异常。
当你创建一个新线程时,你创建了一个全新的堆栈,它根本不是try块的动态上下文的一部分,即使对pthread_create的调用是在try中。
不,main不会捕获从其他线程抛出的异常。您需要使用非标准的、特定于平台的工具来处理未处理的异常,以便按照您所描述的方式聚合处理。
当我构建这样的应用程序时,我确保每个活动对象都有自己的顶级异常处理块,精确地防止一个线程失败导致整个应用程序崩溃。我认为使用特定于平台的catch只会让你的整体代码/解决方案显得草率。我不会用这样的东西。
考虑抛出异常展开堆栈。每个线程都有自己的堆栈。你必须在每个线程函数中放置一个try/catch块(即在每个线程的入口点)。