Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在我的C+;中的某个地方发生运行时错误时打印内容+;密码?_C++_C++11_Error Handling - Fatal编程技术网

C++ 如何在我的C+;中的某个地方发生运行时错误时打印内容+;密码?

C++ 如何在我的C+;中的某个地方发生运行时错误时打印内容+;密码?,c++,c++11,error-handling,C++,C++11,Error Handling,通常情况下,当代码遇到运行时错误时,它会使用运行时标志终止,我打算在终止之前打印一条自定义消息&我希望“返回0”,即在打印自定义消息之后正常终止代码,就好像从未发生过运行时一样 知道怎么做吗?首先定义自定义终止处理程序,类似于: void f() { std::cout << \\ your custom message } 要将函数f设置为终止处理程序。程序终止的原因有很多 第一:抛出了一个未捕获的异常。如果是的话,你在寻找什么,那么按照保罗·埃文斯给出的建议去做。使用C

通常情况下,当代码遇到运行时错误时,它会使用运行时标志终止,我打算在终止之前打印一条自定义消息&我希望“返回0”,即在打印自定义消息之后正常终止代码,就好像从未发生过运行时一样


知道怎么做吗?

首先定义自定义终止处理程序,类似于:

void f() {
    std::cout << \\ your custom message
}

要将函数
f
设置为终止处理程序。

程序终止的原因有很多

第一:抛出了一个未捕获的异常。如果是的话,你在寻找什么,那么按照保罗·埃文斯给出的建议去做。使用C++11,您可能需要调用
get_terminate()
,并在新的teminate处理程序末尾调用返回的teminate处理程序:

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);
}

第三:操作系统可能只是决定终止进程。这可以通过正常信号(例如SIGTERM)或无法处理的信号(例如SIGKILL)来完成。在第二种情况下,您没有机会在程序中注意到这一点。第一种情况已经介绍过了。

您的意思是什么?无论您的代码当前在哪里“使用运行时标志终止”,add
std::cerr@TonyD:我不明白你说的话,但如果我不知道RTE在哪里/如何发生,这就行不通了。@BoBTFish:是的,我的意思是当我们除以0时触发了错误。你不知道哪里和为什么会有错误,但你想隐藏它。我有点担心。听起来像是解决方案,但显然不起作用:/See@zoooz,这不是一个错误。在您的例子中,您运行的是数组边界,这不是一个定义良好的错误条件,它是一个UB,您不能用它做任何有意义的事情。这是操作系统终止您的程序。它超出了您的程序范围,无法对其执行任何操作。@Revolver\u Ocelot:但对于UB,SEGFULT没有返回吗?这里返回的RTE不是吗?@zoooz您必须调用
set\u terminate
函数(例如
set\u terminate(f)
)。在ideone上的代码中,您正在本地声明一个函数。@Zoooz“但是对于UB,SEGFAULT没有返回吗?”-它可能会以任何方式崩溃或损坏程序行为,这就是为什么它被称为未定义行为的原因。谷歌。“RTE正在返回,不是吗?”-什么是“RTE”?在代码< > /Cord>中调用C++异常类:调用<代码> STD::RunTimeOrthyEng/<代码>,但这不是由越界访问引发的,也不是由0或许多其他错误除以。如果你想用一种语言来告诉你编程中的错误,那就从Java开始,它可以做更多的检查(而且速度较慢)。
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);
}
void sig_handler(int signal) {
    new_terminate_handler();
}

// ...
std::signal(SIGTERM, sig_handler);
std::signal(SIGSEGV, sig_handler);
std::signal(SIGINT, sig_handler);
// ...