std::uncaught_exceptions对于避免所有异常有用吗

Is std::uncaught_exceptions useful for avoiding all exceptions?

本文关键字:异常 有用 uncaught exceptions std 于避免      更新时间:2023-10-16

我需要在应用程序中捕获分段错误和其他未知异常。但我不知道我该怎么做!我可以使用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函数来捕获某些错误,如SIGSEGVSIGFPESIGILL,例如:

#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的提示。

希望这能有所帮助。