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

时间:2011-10-11 18:11:44

标签: c++ exception-handling pthreads

我有一个非常大的应用程序,可以动态加载共享对象并在共享对象中执行代码。作为预防措施,我在main几乎所有内容中都试了一下。我为3件事创建了一个捕获:myException(内部异常),std::exception...(捕获所有异常)。

作为共享对象执行的一部分,创建了许多pthreads。当一个线程抛出异常时,main不会捕获它。这是标准行为吗?我怎样才能捕获所有异常,无论它们被抛出什么线程?

4 个答案:

答案 0 :(得分:36)

  

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

没有

  

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

是的,这是标准行为。

要捕获源自线程X的异常,您必须在线程try中具有catch - X子句(例如,围绕线程函数中的所有内容) ,就像你在main中所做的那样。)

有关相关问题,请参阅How can I propagate exceptions between threads?

答案 1 :(得分:16)

你的问题是要求一些在概念上不可能的东西。

尝试块被定义为堆栈的动态构造。 try块捕获通过调用从其内容动态到达的代码抛出的异常。

当你创建一个新线程时,你创建一个全新的堆栈,它不是try块的动态上下文的所有部分,即使对pthread_create的调用是在try中。

答案 2 :(得分:9)

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

当我构建这样的应用程序时,我确保每个活动对象都有自己的顶级异常处理块,正是为了防止整个应用程序在一个线程失败时爆炸。使用特定于平台的捕获所有我认为你的整体代码/解决方案是草率的。我不会用这样的东西。

答案 3 :(得分:7)

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