0.目录

1.异常的最终处理

2.结束函数terminate()

3.小结

1.异常的最终处理

问题:

如果在main函数中抛出异常会发生什么?

如果异常不处理,最后会传到哪里?

下面的代码的输出什么?

示例——异常的最终处理?:

#include <iostream>

using namespace std;

class Test
{
public:
Test()
{
cout << "Test()";
cout << endl;
} ~Test()
{
cout << "~Test()";
cout << endl;
}
}; int main()
{
static Test t; throw 1; return 0;
}

运行结果为:

[root@bogon Desktop]# g++ test.cpp
[root@bogon Desktop]# ./a.out
Test()
terminate called after throwing an instance of 'int'
Aborted (core dumped)

(不同编译器的运行结果不同。)

2.结束函数terminate()

  • 如果异常无法被处理,terminate() 结束函数会被自动调用
  • 默认情况下,terminate() 调用库函数 abort() 终止程序
  • abort() 函数使得程序执行异常而立即退出
  • C++支持替换默认的 terminate() 函数实现

terminate() 函数的替换:

  • 自定义一个无返回值无参数的函数

    1. 不能抛出任何异常
    2. 必须以某种方式结束当前程序
  • 调用 set_terminate() 设置自定义的结束函数
    1. 参数类型为 void (*) ()
    2. 返回值为默认的 terminate() 函数入口地址

示例1——自定义结束函数:

#include <iostream>
#include <cstdlib>
#include <exception> using namespace std; void my_terminate()
{
cout << "void my_terminate()" << endl;
exit(1);
} class Test
{
public:
Test()
{
cout << "Test()";
cout << endl;
} ~Test()
{
cout << "~Test()";
cout << endl;
}
}; int main()
{
set_terminate(my_terminate); static Test t; throw 1; return 0;
}

运行结果为:

[root@bogon Desktop]# g++ test.cpp
[root@bogon Desktop]# ./a.out
Test()
void my_terminate()
~Test()

exit(1);改为abort();后的运行结果:

示例2——自定义结束函数:

void my_terminate()
{
cout << "void my_terminate()" << endl;
// exit(1);
abort();
}

运行结果为:

[root@bogon Desktop]# g++ test.cpp
[root@bogon Desktop]# ./a.out
Test()
void my_terminate()
Aborted (core dumped)

(abort()函数是异常终止一个程序,并且异常终止的时候不会调用任何对象的析构函数。如果调用的是exit()函数,那么会确保所有的全局对象和静态局部对象的析构函数被调用。)

面试题:

如果析构函数中抛出异常会发生什么情况?

示例——析构函数抛出异常:

#include <iostream>
#include <cstdlib>
#include <exception> using namespace std; void my_terminate()
{
cout << "void my_terminate()" << endl;
exit(1);
} class Test
{
public:
Test()
{
cout << "Test()";
cout << endl;
} ~Test()
{
cout << "~Test()";
cout << endl; throw 2;
}
}; int main()
{
set_terminate(my_terminate); static Test t; throw 1; return 0;
}

运行结果为:

[root@bogon Desktop]# g++ test.cpp
[root@bogon Desktop]# ./a.out
Test()
void my_terminate()
~Test()
Aborted (core dumped)

(析构函数中不能抛出异常,可能导致 terminate() 多次调用)

(不同编译器之间在默认的 terminate() 函数实现上有差异。)

3.小结

  • 如果异常没有被处理,最后 terminate() 结束整个程序
  • terminate() 是整个程序释放系统资源的最后机会
  • 结束函数可以自定义,但不能继续抛出异常
  • 析构函数中不能抛出异常,可能导致 terminate() 多次调用

C++解析-外传篇(1):异常处理深度解析的更多相关文章

  1. C++解析-外传篇(2):函数的异常规格说明

    0.目录 1.异常规格说明 2.unexpected() 函数 3.小结 1.异常规格说明 问题: 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++提供语法用于声明函数所抛出的异常 异常声明 ...

  2. C++解析-外传篇(3):动态内存申请的结果

    0.目录 1.动态内存申请一定成功吗? 2.new_handler() 函数 3.小结 1.动态内存申请一定成功吗? 问题: 动态内存申请一定成功吗? 常见的动态内存分配代码: C代码: C++代码: ...

  3. Java-XML解析第一篇主流开源类库解析XML

    1.流行的XML解析框架 1>底层解析方式:存在编码复杂性.难扩展.难复用.....想了解底层解析方式请参考:浅谈 Java XML 底层解析方式 2>Dom4j:基于 JAXP 解析方式 ...

  4. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  5. Unity加载模块深度解析(网格篇)

    在上一篇 加载模块深度解析(一)中,我们重点讨论了纹理资源的加载性能.这次,我们再来为你揭开其他主流资源的加载效率. 这是侑虎科技第53篇原创文章,欢迎转发分享,未经作者授权请勿转载.同时如果您有任何 ...

  6. 深入了解webkit内核第一篇:JavaScript引擎深度解析

    看到HorkeyChen写的文章<[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现>,写的很好,深受启发.想补充一些Horkey没有写到的 ...

  7. [WebKit内核] JavaScriptCore深度解析--基础篇(一)字节码生成及语法树的构建

    看到HorkeyChen写的文章<[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现>,写的很好,深受启发.想补充一些Horkey没有写到的 ...

  8. jQuery2.x源码解析(回调篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...

  9. Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

    http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...

随机推荐

  1. slqite3练习

    连接 import sqlite3 con = sqlite3.connect(":memory:") c = con.cursor() # Create table c.exec ...

  2. hadoop hdfs 找不到本地库解决办法

    export LD_LIBRARY_PATH=/usr/lib/hadoop-0.20-mapreduce/lib/native/Linux-amd64-64 <-- HAOOP_HOME/li ...

  3. vue 3.0使用 BUG解决

    最近在做vue的项目,吊进了很多坑,这些坑很浅,但一旦掉进去了,不花点功夫还爬不出来.所以总结下,当做下笔记,持续更新 1.<router-link> 里加的事件没反应 错误代码: < ...

  4. 洛谷2612&&bzoj2817 [ZJOI2012]波浪

    洛谷2612&&bzoj2817 [ZJOI2012]波浪 原题链接 题解 因为有abs不太好搞,考虑拆掉abs. 生成排列的方法之一:n个空位,从1到n一次插入一个空位. 这样搞的话 ...

  5. [ASP.NET Core] 建置x86版本 (workaround)

    前言 本篇文章介绍如何建置ASP.NET Core项目的x86版本输出(workaround),为自己留个纪录也希望能帮助到有需要的开发人员. ASP.NET Core官网 步骤 首先到微软官网的「. ...

  6. React入门基础(学习笔记)

    这篇博客是我通过阅读React官方文档的教程总结的学习笔记,翻译可能存在误差,如有疑问请参见http://reactjs.cn/react/docs/tutorial.html . 一.所需文件 在编 ...

  7. oracle 查看锁表及解锁的语句

    解锁语句: alter system kill session 'sid, serial#'; alter system kill session '23, 1647'; 查询那些对象被锁: sele ...

  8. Python接口测试实战3(下)- unittest测试框架

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  9. 《图解 HTTP 》阅读 —— 第五章

    第5章 与HTTP协作的web服务器 一台服务器可以托管多个域名. 在相同的IP地址下,虚拟主机可以寄存多个不同主机名和域名的网站,所以在发送HTTP请求时,必须在Host首部内指定完整的主机名和域名 ...

  10. JavaScript/Jquery:Validform 验证表单的相关属性解释

    当我们写提交表单的时候往往需要验证表单是否填写了内容,是否正确,这个插件可以很方便的完成我们需要的验证! 使用方法: 1.先引用js <script type="text/javasc ...