std::uncaught_exceptions对于避免所有异常有用吗
Is std::uncaught_exceptions useful for avoiding all exceptions?
我需要在应用程序中捕获分段错误和其他未知异常。但我不知道我该怎么做!我可以使用std::uncaught_exceptions来达到这个目的吗?
我可以为此使用
std::uncaught_exceptions
吗?
考虑一下这个代码:
int main(int argc, char* argv[])
{
int *val = NULL;
*val = 1;
std::cout << "uncaught: " << std::uncaught_exceptions() << std::endl;
return 0;
}
这可能会导致分段故障,并且不会输出任何内容。
我需要在应用程序中捕获分段错误和其他未知异常。但我不知道我该怎么做!
C++中的异常处理可以通过try-catch
块来完成,并且可以使用std::signal
函数来捕获某些错误,如SIGSEGV
、SIGFPE
或SIGILL
,例如:
#include <iostream>
#include <exception>
#include <csignal>
#include <cstdio>
extern "C" {
void sig_fn(int sig)
{
printf("signal: %dn", sig);
std::exit(-1);
}
}
int main(int argc, char* argv[])
{
int *val = NULL;
std::signal(SIGSEGV, sig_fn);
try {
*val = 1;
} catch (...) {
std::cout << "..." << std::endl;
}
if (std::uncaught_exception()) {
std::cout << "uncaught" << std::endl;
}
std::cout << "return" << std::endl;
return 0;
}
但您应该注意,这种类型的异常处理实际上是为了进行清理和关闭,而不一定是捕获和释放;以这个代码为例:
#include <iostream>
#include <exception>
#include <csignal>
#include <cstdio>
extern "C" {
void sig_fn(int sig)
{
printf("signal: %dn", sig);
}
}
int main(int argc, char* argv[])
{
int *val = NULL;
std::signal(SIGSEGV, sig_fn);
while (true) {
try {
*val = 1;
} catch (...) {
std::cout << "..." << std::endl;
}
}
if (std::uncaught_exception()) {
std::cout << "uncaught" << std::endl;
}
std::cout << "return" << std::endl;
return 0;
}
此代码将永远导致并捕获分段错误!
如果您试图捕捉分段故障,您需要首先调查分段故障(或任何错误)发生的原因,并纠正该问题;以上面的代码为例:
int *val = NULL;
if (val == NULL) {
std::cout << "Handle the null!" << std::endl;
} else {
*val = 1;
}
为了进一步阅读:这里是一个SO问答;关于segfault是什么,这里有关于它的Wiki,麻省理工学院也有一些关于处理和调试segfault的提示。
希望这能有所帮助。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 其中降频广播实际上是有用的
- 尝试使用智能指针时引发异常
- std::uncaught_exceptions对于避免所有异常有用吗
- 为什么异常规范不能有用