当我的 C++ 代码中的某处发生运行时错误时,如何打印某些内容?

Mag*_*gam 2 c++ error-handling c++11

通常发生的情况是,当代码面临运行时错误时,它只是以运行时标志终止,我打算做的是在终止前打印自定义消息 & 我希望“返回 0”,即在打印自定义消息后正常终止代码,就好像运行时永远不会一样发生了。

知道怎么做吗?

cdo*_*nat 5

程序可能终止的原因有多种。

第一:抛出一个未捕获的异常。如果那是您正在寻找的,那么请遵循 Paul Evans 给出的建议。使用 C++11,您可能想要调用get_terminate(),并在新的终止处理程序结束时调用返回的终止处理程序:

terminate_handler old_terminate_handler = nullptr;

void new_terminate_handler() {
    std::cerr << "terminate due to error" << std::endl;
    if( old_terminate_handler != nullptr ) {
        old_terminate_handler();
    } else {
        std::abort();
    }
}

int main(int, char**) {
    old_terminate_handler = get_terminate();
    set_terminate(new_terminate_handler);
}
Run Code Online (Sandbox Code Playgroud)

第二:收到一个信号,通常会终止程序。安装一个信号处理程序来捕获它:

void sig_handler(int signal) {
    new_terminate_handler();
}

// ...
std::signal(SIGTERM, sig_handler);
std::signal(SIGSEGV, sig_handler);
std::signal(SIGINT, sig_handler);
// ...
Run Code Online (Sandbox Code Playgroud)

第三:操作系统可能只是决定终止进程。这要么由普通信号信号(例如 SIGTERM)完成,要么由无法处理的信号(例如 SIGKILL)完成。在第二种情况下,您没有机会在程序内部注意到这一点。第一种情况已经涵盖。