为什么pthreadexit抛出被省略号捕获的东西
why does pthread_exit throw something caught by ellipsis?
如果pthread_create
调用的函数具有以下结构
try{
...code....
pthread_detach(pthread_self());
pthread_exit(NULL);
}catch(...){
std::cout<<"I am here"<<std::endl;
}
为什么在执行pthread_exit
时调用省略号的异常处理程序?(注意,例如,std::exception
没有抛出)
至少在GCC中,pthread_exit
可能会引发___forced_unvolve异常,该异常用于在线程退出期间展开堆栈。它不是从std::exception
继承的,因此不能被捕获为一个。如果您确实捕捉到了该异常,请确保重新throw
它,以便它可以完成它的工作:
try {
...
} catch (abi::___forced_unwind&) {
throw;
} catch (...) {
// whatever
}
引发异常的原因是pthread_exit
被指定为永远不会返回。让它抛出可以保证清理堆栈分配的变量,并且在它的位置之后不会执行代码(除非你捕捉到展开异常…)。然而,这是不可移植的,例如Clang使用了一种完全不同的机制。
顺便说一句,这是catch (...)
习语弊大于利的又一个例子。它有时被用来"稳定"抛出未知异常的代码。但这只会将损坏的可见性推迟到以后的时间和地点,从而无法确定问题的真正根源。在这种情况下,唯一合理的做法是进行最小限度的清理,可能是记录,然后重新思考。由于未处理的异常而崩溃的进程并不常见,但它可以提供一个可调试的崩溃转储,清楚地显示错误的命令。但这只是我对catch (...)
的怨恨,它与pthread_exit
几乎没有关系。。。
相关文章:
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 省略号在C++中的所有用法
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 可变参数模板和省略号有什么区别?
- 无法理解一段具有完美转发和省略号的C++代码
- GCC 不支持新表达式中的大括号省略号
- C++参数列表中带有省略号的 lambda
- 这个省略号在 c++ 中是什么:#define MBGL_DEFINE_ENUM(T,值...)?
- 使用可变参数模板函数包装基于省略号的函数
- 如何声明省略号定义为未使用va_list
- 为什么pthreadexit抛出被省略号捕获的东西
- count 参数是否应该直接在可变参数函数中的省略号 (..) 之前声明
- 省略号函数参数的大小(以字节为单位)
- 如何将参数从省略号运算符传递到其他函数
- 转发省略号参数时丢失数据
- 计算字符串中的省略号而不是句点
- CListCtrl显示省略号,尽管空间很大(只有Win2008和Win7)
- cpp:用省略号捕获异常并查看信息
- 在复制构造函数中省略号的含义是什么?
- 使用省略号转换指针到函数