【问题标题】:How to print something when runtime error occurs somewhere in my C++ code?当我的 C++ 代码中某处发生运行时错误时,如何打印某些内容?
【发布时间】:2015-12-17 11:14:30
【问题描述】:

通常发生的情况是当代码面临运行时错误时,它只是以运行时标志终止,我打算做的是在终止之前打印一条自定义消息并且我希望“返回 0”,即在打印自定义消息后正常终止代码为如果运行时从未发生过。

知道怎么做吗?

【问题讨论】:

  • "runtime error" 是什么意思?
  • 无论您的代码当前在哪里“使用运行时标志终止[ing]”,添加std::cerr << "terminating due to error\n"; exit(0);。您还可以像 int main(int argc, char* argv[]) try { ... } catch(...) { std::cerr << "terminating due to exception\n"; } 那样构建您的 main 函数。您可能希望为其他类型的错误安装信号处理程序,让它们cerr/exit 类似:google "signal handler sigaction C++" for example code。
  • @TonyD :我不明白你说什么,但如果我不知道 RTE 发生在哪里/如何发生,这将不起作用。
  • @BoBTFish :是的,我的意思是当我们除以 0 时触发错误......
  • 您不知道哪里以及为什么会出现错误,但您想隐藏它。我有点担心。

标签: c++ c++11 error-handling


【解决方案1】:

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

首先:抛出了一个未捕获的异常。如果那是您正在寻找的东西,那么请遵循 Paul Evans 给出的建议。对于 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);
}

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

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

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

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

【讨论】:

    【解决方案2】:

    首先定义您的自定义终止处理程序,例如:

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

    然后你想打电话:

    std::terminate_handler set_terminate( std::terminate_handler f );
    

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

    【讨论】:

    • 听起来像是解决方案,但显然它不起作用:/ 见ideone.com/onWd1Q
    • @ZooOoz ,这不是错误。在您的情况下,您在数组边界上运行,这不是一个定义明确的错误条件,它是一个 UB,您不能用它做任何有意义的事情。这是操作系统终止您的程序。它超出了你的程序范围,它不能用它做任何事情。
    • @Revolver_Ocelot :但是对于 UB 不返回 SEGFAULT 吗?这里RTE被退回不是吗?
    • @ZooOoz 你必须调用set_terminate 函数(例如set_terminate(f))。在 ideone 上的代码中,您在本地声明一个函数。
    • @ZooOoz “但是对于 UB,SEGFAULT 没有返回吗?” - 它可能以任何方式崩溃或破坏程序行为,这就是它被称为 的原因未定义 行为。去谷歌上查询。 “这里不是返回 RTE 吗?” - 什么是“RTE”? &lt;stdexcept&gt; 中有一个名为 std::runtime_error 的 C++ 异常类,但这不是由越界访问引发的,也不是除以 0 或许多其他错误。如果您想要一种能够更多地告诉您编程中的错误的语言,请从例如开始。 Java,它进行更多检查(并且速度较慢)。
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多