C++异常处理之terminate函数
C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,
学会使用terminate函数有助于异常处理
一 当一个异常产生的时候调用terminate函数,代码:
[cpp] view plaincopyprint?
- #include <iostream>
- #include <exception>
- using namespace std;
- void on_terminate(){
- cout<<"terninate function called!"<<endl;
- cin.get();
- }
- int main(void){
- set_terminate(on_terminate);
- throw exception();
- cout<<"terminate function not called!"<<endl;
- cin.get();
- return 0;
- }
terminate被调用的情况:
1 当发送一个异常,并且构造函数产生异常
2 当发送一个异常,或者析构函数产生异常
3 一个静态对象的构造或者析构发送一个异常
4 以atexit注册的函数发生异常的时候
5 自定义一个异常,但是实际上没有异常产生的时候
6 调用缺省的unexcepted()函数时候
例子说话:
[cpp] view plaincopyprint?
- #include <iostream>
- #include <exception>
- using namespace std;
- void on_terminate(){
- cout<<"terminate function called!"<<endl;
- cin.get();
- }
- class custom_exception{
- custom_exception(){
- }
- custom_exception(const custom_exception& excep){
- throw exception();
- }
- };
- void case_1(){
- try{
- throw custom_exception();
- }
- catch(...){
- }
- }
当一个函数抛出了一个throw异常的时候,如果该函数内部构造了对象的话,系统会先对该对象调用析构函数,当对象调用完了析构函数以后,才开始执行异常的抛出工作。
同时在具有继承关系的类的异常中,子类的异常应该放在前面,而基类的异常应该放到最后面,这样可以使子类的异常先获得处理,父类的异常最后处理。
[cpp] view plaincopyprint?
- #include<iostream>
- using namespace std;
- class X
- {
- public:
- class Trouble {}; //注意:类中嵌套类的申明和定义,学习!!!
- class small: public Trouble {};
- class big:public Trouble {};//类中的继承!!!
- void f(){
- throw big();
- }
- };
- int main()
- {
- X x;
- try{
- x.f();
- }
- catch(X::Trouble &)
- {
- cout<<"caught Trouble"<<endl;
- }
- catch(X::small&)
- {
- cout<<"caught small"<<endl;
- }
- catch(X::big&)
- {
- cout<<"caught big"<<endl;
- }
- return 0;
- }
如果这样的话,抛出的big()类型异常则被trouble类垄断,应该倒着写才可以实现顺序捕获所有异常,另外使用...可以捕捉所有的异常,这个应该放到最后面才可以。
省略号异常处理器不允许接受任何参数,所以无法得到任何相关异常的信息,也无法知道异常的类型,这种catch语句经常用于清理资源并重新抛出所捕获的异常。
https://blog.csdn.net/wangyin159/article/details/46584257?ref=myread
C++异常处理之terminate函数相关推荐
- 学习用于异常处理的terminate()函数
<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; ...
- java terminate_学习Java用于异常处理的terminate()函数
异常处理是一个微妙的问题,你应该尽可能优雅地处理所有异常.要达到这个目的,你需要学习terminate()函数. terminate()函数在程序抛出一个异常并且异常没有被捕获的时候被调用,像下面这样 ...
- python多进程之进程的terminate() 函数
python多进程之进程的terminate() 函数 terminate() 函数 是用来杀死子进程的 举例如下: from multiprocessing import Process impor ...
- 3. C++ terminate()函数
1.terminate()函数 C++中,异常不可以忽略,当异常找不到匹配的catch字句时,会调用系统的库函数terminate()(在头文件中).terminate()函数在程序抛出一个异常并且异 ...
- C++专题:异常处理与转换函数,智能指针,STL模板
目录 异常处理 转换函数 智能指针 STL标准模板库 异常处理 什么是异常? 程序中常见的错误分为两大类:编译时错误和运行时错误.编译时的错误主要是语法错误,如关键字拼写错误.语句末尾缺分号.括号不匹 ...
- 量化交易之python基础篇 - 常规异常处理、在函数中主动抛出异常
# 常规异常处理 try:num = int(input("请输入一个整数:"))result = 100 / numprint(result) except ZeroDivisi ...
- C++程序闪退原因定位
内部直接或者间接调用了terminate函数或者abort函数,terminate函数内部也是默认调用了abort函数. C++异常处理之terminate函数 C++中处理异常的过程是这样的:在执行 ...
- 学习资料2900篇(4~6)
1451 round 方法 1452 RSS 2.0 Specification 1453 Ruby入门之代码块.迭代子和过程对象 1454 SAS9新体验:在DATA STEP中使用JAVA对 ...
- 【C++】 外传篇 2_函数的异常规格说明
函数的异常规格说明 问题: 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++ 提供语法用于声明函数所抛出的异常 异常声明作为函数声明的修饰符,写在参数列表后面 /** 可能抛出任何异常 */ ...
最新文章
- Exchange企业实战技巧(5)配置OWA域名简写
- unity3d鼠标拖拽模型,旋转模型
- 1986年讲MDCT的基础性论文
- C#中的线程(三) 使用多线程
- spring整合hibernate的applicationContext.xml文件配置以及web.xml
- 问题:anaconda: command not found 解决方案
- 4G + 1G = 5G?
- 使用 JS 实现页面跳转的几种方式总结,小菜一碟!
- 基于Dx11写一个自己的游戏引擎--1
- VTK源码阅读--vtkObject类-观察者/命令模式
- Android Camera:从零开发一款相机APP Day01:前景
- 用Excel自动产生日期
- 数学里上凹,下凹,上凸,下凸
- 免费银行卡验证API接口
- Python——习题:生成银行卡号和密码
- repo 工具使用手册
- 励志名言---002
- 利用VMware搭建centos环境
- python3.7 匹配淘口令
- 【HTML+CSS】日历备忘录(静态)
热门文章
- Coresight - Devicetree/ACPI简介
- C语言-字符串匹配题目
- 2018年中国(上海)国际乐器本特历奈特钢琴荣耀参展
- GWAS全基因组关联分析流程(BWA+samtools+gatk+Plink+Admixture+Tassel)
- 【音视频】Ubuntu环境安装以及ffmpeg安装
- 【每日随笔】摩托车驾驶 ④ ( 德州增驾摩托车 D 本记录 | 考场位置 “ 德州市公安局交警支队直属四大队车辆管理所 “ )
- js获取本机的外网/广域网ip地址
- P3225 [HNOI2012] 矿场搭建
- 西南名族大学计算机科学与技术学院,西南民族大学计算机科学与技术学院副院长雷开彬一行来我院调研...
- [kotlin]kotlin中的伴生对象(companion object)到底是个什么东西?