在c ++中是否有一个catch-all-failures钩子?

时间:2012-08-24 13:25:37

标签: c++ error-handling

我希望当程序失败的时候比在这个处理程序中捕获它以便做一些警卫通知。

我需要注册一个底部处理程序或处理程序列表,以确保程序在不通过我的处理程序的情况下不会崩溃吗?

在ubuntu上运行,解决方案只需要ubuntu 我需要像异常内存分配这样的各种故障...

7 个答案:

答案 0 :(得分:2)

C ++不会在虚拟沙箱中运行,因此没有任何内置语言来捕获它。你当然可以自己构建一个(例如使用异常),但是由你的代码来自基础构建它。

您正在运行的平台可能有一些您可以使用的东西。例如,在Windows中有SetUnhandledExceptionFilter

当然,所有这些仍取决于“崩溃”的含义。

答案 1 :(得分:2)

在流程启动时,请致电fork。使用父级来监视孩子。如果遇到致命错误,该过程将消失。您可以检测到这一点,并在发生这种情况时执行您需要执行的操作。如果孩子希望正常终止,它可以在终止之前简单地杀死它的父母。

答案 2 :(得分:2)

对于正常的程序退出,您可以使用std::atexit()注册处理程序。

对于因uncaught exceptions/...而导致的程序退出,您可以使用std::set_terminate注册处理程序。如果通过“异常内存分配”表示std::bad_alloc异常,则应触发此处理程序。

答案 3 :(得分:2)

简单的答案是,没有单点可以处理程序中的所有错误。您可以在try/catch (...)中添加main来处理在输入main之后和完成之前发生的异常。您还可以在C ++中为terminate添加处理程序。然后根据操作系统,您还需要以不同的方式处理其他情况(通过处理SIG_SEGV可以在unix / linux中处理无效的内存引用,但这在Windows中不起作用--AFAIK;其他一些错误可能会触发不同的信号,或者没有被处理...)除此之外,可能还有一些错误仍未被注意(例如,无效的内存访问碰巧遇到有效的内存地址......程序将不正确,但错误可能无法检测到)< / p>

答案 4 :(得分:1)

在Linux中您需要回复SIGABRT信号。只要您的应用获得SIGABRT信号,就会调用callback

signal(SIGABRT, &callback);

不同的方案有不同的信号,例如您需要挂钩的SIGSEGVSIGBUS。你最好在不同的回调中挂钩它们并检查哪个错误进入了什么。因为多个问题可能会导致一个错误。

答案 5 :(得分:0)

没有。例如,如果使用kill进行SIGKILL过程,则不会运行任何处理程序。

P.S。仅供参考,这与SPOF无关。

答案 6 :(得分:0)

您可以在顶层放置try / catch(...)块来捕获所有异常。但是还有其他方法可以终止程序,捕获它们的方法也不可移植。在基于Unix的系统上,您必须创建信号处理程序,但即使这些也不会停止kill -9