📅  最后修改于: 2023-12-03 14:59:50.575000             🧑  作者: Mango
在C++中,raise()
函数用于手动触发异常,可以从当前函数中抛出异常到更高级别的函数中处理。该函数需要一个整数类型的参数作为异常代码。
raise()
函数需要在程序中引入 <signal.h>
头文件。其使用方法如下:
#include <signal.h>
void mySignalHandler(int signum) {
std::cout << "Caught signal: " << signum << std::endl;
}
int main() {
signal(SIGINT, mySignalHandler); // 注册信号处理函数
while(true) {
std::cout << "Looping..." << std::endl;
sleep(1);
}
return 0;
}
在上面的代码中,我们通过 signal()
函数注册了 mySignalHandler()
函数作为 SIGINT
信号的处理函数。在程序运行时,当用户按下 Ctrl+C
组合键时,操作系统会向程序发送一个 SIGINT
信号,此时我们注册的处理函数就会被调用,打印出 "Caught signal: 2"。
我们可以修改 mySignalHandler()
函数的代码,手动触发一个异常,如下所示:
void mySignalHandler(int signum) {
std::cout << "Caught signal: " << signum << std::endl;
throw signum; // 触发异常
}
现在,当信号处理函数被调用时,它会抛出一个异常,这个异常代码就是 signum
。我们可以在更高级别的函数中捕获这个异常并进行处理。
int main() {
signal(SIGINT, mySignalHandler);
try {
while(true) {
std::cout << "Looping..." << std::endl;
sleep(1);
}
} catch(int signal) {
std::cout << "Caught exception: " << signal << std::endl;
}
return 0;
}
在 main()
函数中,我们加上了一个 try-catch
块,用于捕获异常。如果异常被抛出,程序会跳转到 catch
块中执行,打印出 "Caught exception: 2"。
只有在信号处理函数中才能调用 raise()
函数。在其他函数中调用 raise()
函数是没有意义的。
如果在信号处理函数中多次调用 raise()
函数,只有最后一次会生效。
如果在信号处理函数中触发了异常,但没有进行捕获和处理,程序会崩溃。
可以使用 abort()
函数在任何时候退出程序并打印出错误信息。但是使用 abort()
函数退出程序时,不会调用 atexit()
注册的清理函数。