为什么pthread_exit抛出省略号捕获的东西?

时间:2012-07-12 13:08:57

标签: c++ exception exception-handling pthreads cancellation

如果pthread_create调用的函数具有以下结构

try{
  ...code....
  pthread_detach(pthread_self());
  pthread_exit(NULL);
}catch(...){
  std::cout<<"I am here"<<std::endl;
}

为什么省略号的异常处理程序在执行pthread_exit时被调用? (请注意,例如,std::exception不会被抛出)

1 个答案:

答案 0 :(得分:26)

pthread_exit可能抛出___forced_unwind异常,用于在线程退出期间展开堆栈。它不会从std::exception继承,因此不能被捕获为一个。如果你确实发现了这个异常,请务必重新throw它以便它可以完成它的工作:

try {
...
} catch (abi::___forced_unwind&) {
    throw;
} catch (...) {
    // whatever
}

抛出异常的原因是指定pthread_exit永远不会返回。让它抛出保证堆栈分配变量的清理,并且在其位置之后不执行代码(除非你捕获展开异常......)。

顺便说一句,这是catch (...)成语弊大于利的另一种情况。它有时用于“稳定”抛出未知异常的代码。但这只会将损害的可见性推迟到以后的时间和地点,使得无法确定问题的真正根源。在这样的捕获中唯一合理的事情是最小的清理,可能是日志记录,然后重新抛出。由于未处理的异常导致崩溃的进程不是很明显,但它可以提供可调试的崩溃转储,清楚地显示错误的命令。但这只是我对catch (...)的怨恨,这与pthread_exit几乎没有关系......

相关问题