将main()捕获从线程抛出的异常



我有一个非常大的应用程序,它动态加载共享对象并在共享对象中执行代码。作为预防措施,我对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块(即在每个线程的入口点)。

最新更新