在c++中使用省略号
ellipsis try catch on c++
可以使用省略号try-catch来捕获所有可能导致崩溃的错误吗?有什么异常吗?
try
{
//some operation
}
catch(...)
{
}
不,它只捕获c++异常,而不是像分段错误,SIGINT等。
您需要仔细阅读并理解c++异常与"C风格"信号(如SIGINT)之间的区别。
如果try/catch块中的代码以某种方式崩溃,则程序无论如何都处于不可恢复状态。你不应该试图阻止崩溃,程序所能做的最好的事情就是让进程崩溃。
"异常"是指您的代码只捕获异常,而不捕获错误。即使代码是异常安全的(如果您试图通过try/catch块来解决其错误,则可能不是这种情况),任何其他内部错误都可能使程序进入不可恢复的状态。根本没有办法保护程序不受它的侵害。
补充:看看这篇文章"旧的新东西"的一些见解。
这是Catch All处理程序。
它捕获从try块抛出的所有c++异常。它不会捕获段错误和其他导致程序崩溃的信号。
在使用它的时候,你需要把这个处理程序放在所有其他特定的catch处理程序的末尾,否则你所有的异常都会被这个处理程序捕获。
使用catch all处理器是一个坏主意,因为它只是通过捕获所有(甚至未被识别的)异常来掩盖你的问题和隐藏程序的无能。如果您面临这种情况,您最好让程序崩溃,并创建一个崩溃转储,以便稍后进行分析并解决问题的根源。
它捕获抛出的所有内容,它不限于异常。它不处理诸如windows调试断言、系统信号、段错误之类的事情。
TEST(throw_int) {
try {
throw -1;
} catch (std::exception &e) {
std::cerr << "caught " << e.what() << std::endl;
} catch (...) {
std::cerr << "caught ..." << std::endl;
}
}
但是,不建议抛出整数。最好扔掉从std::exception
继承的东西。
您可能期望看到这样的东西作为记录失败的最后努力。有些应用程序并不需要非常健壮。内部工具的成本可能会超过它们的价值,如果你经历了使它们比拼凑起来的垃圾更好的步伐。
int main(int argc, char ** argv) {
try {
// ...
} catch (std::exception &e) {
std::cerr << "error occured: " << e.what() << std::endl;
return 1;
}
return 0;
}
相关文章:
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 省略号在C++中的所有用法
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 可变参数模板和省略号有什么区别?
- 无法理解一段具有完美转发和省略号的C++代码
- GCC 不支持新表达式中的大括号省略号
- C++参数列表中带有省略号的 lambda
- 这个省略号在 c++ 中是什么:#define MBGL_DEFINE_ENUM(T,值...)?
- 使用可变参数模板函数包装基于省略号的函数
- 如何声明省略号定义为未使用va_list
- 为什么pthreadexit抛出被省略号捕获的东西
- count 参数是否应该直接在可变参数函数中的省略号 (..) 之前声明
- 省略号函数参数的大小(以字节为单位)
- 如何将参数从省略号运算符传递到其他函数
- 转发省略号参数时丢失数据
- 计算字符串中的省略号而不是句点
- CListCtrl显示省略号,尽管空间很大(只有Win2008和Win7)
- cpp:用省略号捕获异常并查看信息
- 在复制构造函数中省略号的含义是什么?
- 使用省略号转换指针到函数