C++ 异常的详细介绍
假设函数由于异常(而不是由于返回)而终止,则程序也将释放栈中的内存,但不会师范栈的第一个返回地址后停止,而是继续释放栈,直到找到一个位于Try块的返回地址。随后,控制权将转到块尾的异常处理程序,而不是函数调用后面的第一条语句。这个过程叫做栈解退。 五、exception类 较新的C++编译器将异常合并到语言中,例如,为支持该语言,exception头文件(以前为exception.h 或except.h)定义了 exception类,c++可以把它用作其他异常类的基类。 头文件 exceptionhe 和 stdexcept 定义了一些常用的异常类 有:logic_error、runtime_error、domain_error 等 六、意外异常与未捕获异常处理 异常引发后,在两种情况下,会导致问题。首先,如果它是在带异常规范的函数中引发的,则必须与规范列表的某种异常匹配(在继承层次机构中,类类型与这个类与其派生的对象匹配),否则成为意外异常。在默认情况下,这将导致程序异常终止(虽然C++11摒弃了异常规范,但仍支持它,且有些现有代码使用了它)如果异常不是在函数中引发的(或者函数没有异常规范),则必须捕获它,如果没有捕获(在没有try块或没有匹配的catch块时,将出现这种情况),则异常被称未捕获异常。这将导致程序异常终止。然而可以修改程序对意外异常和为捕获异常的反应。 未捕获异常: 未捕获异常不会导致程序立即异常中终止,相反,程序将首先调用函数terminate()。在默认情况下terminate()调用abort()函数。可以指定terminate()应调用的函数(而不是abort())来修改terminate()的这种行为。为此,可调用set_terminate()函数。set_terminate()和terminate()都是在头文件exception中声明的: typedef void (*terminate_handle)() ; terminate_handle set_terminate(terminate_handle f) throw();//c++ 98 terminate_handle set_terinate(terminate_handle f) noexcept; //c++11 void teminate(); //c++98 void teminate() noexcept ; //c++11 示例: void myQuit() { std::cout << "Terminating due to uncaught exception n"; system("pause"); } 在程序开始时执行: set_terminate(myQuit); 意外异常 如果发生意外异常,程序将调用unexcepted()函数,这个函数将调用teminate(),后者默认滴啊用abort()。和set_terminate()函数一样,也有一个可用于修改unexcepted()的行为的set_unexpeceted()函数。这些函数也是在头文件exception中声明的: typedef void (* unexpected_handle)(); unexpected_handle set_unexpected(unexpected_handle f) throw();//c++98 unexpected_handle set_unexpected(unexpected_handle f) noexpect;//c++11 void unexpected(); c++ 98 void unexpected() noexcept ;//c+ 0x 使用如下: void myUnexpected() { throw std::bad_exception(); // or just throw ; } 在程序开始时: 我在vs 2015下测试,并未实现这种功能,必须显示调用terminate() 和 unexpected(); 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |