Fab*_*era 15 c++ exception-handling exception pthreads cancellation
如果被调用的函数pthread_create具有以下结构
try{
...code....
pthread_detach(pthread_self());
pthread_exit(NULL);
}catch(...){
std::cout<<"I am here"<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么省略号的异常处理程序在执行时被调用pthread_exit?(请注意std::exception,例如,不会抛出)
era*_*ran 27
pthread_exit可能抛出___forced_unwind异常,用于在线程退出期间展开堆栈.它不会继承std::exception,因此不能被捕获.如果您确实捕获了该异常,请确保重新启动throw以便它可以完成其工作:
try {
...
} catch (abi::___forced_unwind&) {
throw;
} catch (...) {
// whatever
}
Run Code Online (Sandbox Code Playgroud)
抛出异常的原因pthread_exit是指定永远不会返回.让它抛出保证堆栈分配变量的清理,并且在其位置之后不执行代码(除非你捕获展开异常......).
顺便说一句,这是另一个catch (...)成语弊大于利的案例.它有时用于"稳定"抛出未知异常的代码.但这只会将损害的可见性推迟到以后的时间和地点,使得无法确定问题的真正根源.在这样的捕获中唯一合理的事情是最小的清理,可能是日志记录,然后重新抛出.由于未处理的异常导致崩溃的进程不是很明显,但它可以提供可调试的崩溃转储,清楚地显示错误的命令.但这只是我的怨恨catch (...),这与pthread_exit... 几乎无关.