我有一个非常大的应用程序,可以动态加载共享对象并在共享对象中执行代码。作为预防措施,我在main
几乎所有内容中都试了一下。我为3件事创建了一个捕获:myException
(内部异常),std::exception
和...
(捕获所有异常)。
作为共享对象执行的一部分,创建了许多pthreads
。当一个线程抛出异常时,main
不会捕获它。这是标准行为吗?我怎样才能捕获所有异常,无论它们被抛出什么线程?
答案 0 :(得分:36)
main()会捕获从线程抛出的异常吗?
没有
当一个线程抛出异常时,它不会被main捕获。这是标准行为吗?
是的,这是标准行为。
要捕获源自线程X
的异常,您必须在线程try
中具有catch
- X
子句(例如,围绕线程函数中的所有内容) ,就像你在main
中所做的那样。)
答案 1 :(得分:16)
你的问题是要求一些在概念上不可能的东西。
尝试块被定义为堆栈的动态构造。 try块捕获通过调用从其内容动态到达的代码抛出的异常。
当你创建一个新线程时,你创建一个全新的堆栈,它不是try块的动态上下文的所有部分,即使对pthread_create的调用是在try中。
答案 2 :(得分:9)
不,main不会捕获从其他线程抛出的异常。您需要使用非标准的,特定于平台的工具来处理未处理的异常,以便按照您描述的方式聚合处理。
当我构建这样的应用程序时,我确保每个活动对象都有自己的顶级异常处理块,正是为了防止整个应用程序在一个线程失败时爆炸。使用特定于平台的捕获所有我认为你的整体代码/解决方案是草率的。我不会用这样的东西。
答案 3 :(得分:7)
考虑抛出异常会展开堆栈。每个线程都有自己的堆栈。您必须在每个线程函数中放置一个try / catch块(即在每个线程的入口点)。