📜  C++中的raise()函数(1)

📅  最后修改于: 2023-12-03 14:59:50.575000             🧑  作者: Mango

C++中的raise()函数

在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"。

注意事项
  1. 只有在信号处理函数中才能调用 raise() 函数。在其他函数中调用 raise() 函数是没有意义的。

  2. 如果在信号处理函数中多次调用 raise() 函数,只有最后一次会生效。

  3. 如果在信号处理函数中触发了异常,但没有进行捕获和处理,程序会崩溃。

  4. 可以使用 abort() 函数在任何时候退出程序并打印出错误信息。但是使用 abort() 函数退出程序时,不会调用 atexit() 注册的清理函数。

参考链接