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

ste*_*225 32 c++ exception-handling pthreads

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

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

NPE*_*NPE 40

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

没有

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

是的,这是标准行为.

要捕获源自线程的异常X,必须在线程中包含try- catch子句X(例如,在线程函数中的所有内容,类似于您已经在的内容main).

有关相关问题,请参阅如何在线程之间传播异常?


bma*_*ies 17

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

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

当您创建一个新线程时,您创建一个全新的堆栈,即使调用pthread_create位于try内部,它也不是try块的动态上下文的所有部分.


Bre*_*ias 9

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

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


Dab*_*ler 7

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