2015-05-12 64 views
3

我读过,可以调用std::set_terminate()使用自己的函数作为全局异常处理程序,它捕获所有未处理的异常。为什么我的终止处理程序从不被调用?

简化我的程序代码:

#include <exception> 
#include <stdexcept> 
#include <iostream> 

void my_terminate_handler() 
{ 
    std::cerr << "Terminate handler" << std::endl; 

    std::cin.get(); 

    std::abort(); 
} 

int main() 
{ 
    std::set_terminate(my_terminate_handler); 

    int i = 1; 
    i--; 

    std::cout << 1/i << std::endl; 

    return 0; 
} 

为什么my_terminate_handler()永远不会调用?在VC++ 2013,2015 RC和gcC++ - 4.8中都是如此。

回答

13

如果程序调用terminate,终止处理程序将被调用。这可能是由于各种原因发生的 - 包括一个未捕获的异常 - 但零除不是其中的原因之一。这给出了未定义的行为;通常,它会引发一个信号(而不是C++异常),并且您需要安装一个信号处理程序,而不是终止处理程序来捕获它。

+0

我可以在全球范围内捕捉到所有这些信号吗? – vladon

+1

@ vladon:[是](http://en.cppreference.com/w/cpp/utility/program/signal)。虽然不能保证零除会产生一个信号:正如我所说的,它给出了未定义的行为。 –

4

因为代码中没有未捕获的异常。添加一个和it gets executed

#include <exception> 
#include <stdexcept> 
#include <iostream> 

void my_terminate_handler() 
{ 
    std::cerr << "Terminate handler" << std::endl; 
} 

int main() 
{ 
    std::set_terminate(my_terminate_handler); 

    throw "cake"; 
} 
相关问题