C++解析-外传篇(1):异常处理深度解析

0.目录

1.异常的最终处理

2.结束函数terminate()

3.小结

1.异常的最终处理

问题:
如果在main函数中抛出异常会发生什么?
如果异常不处理,最后会传到哪里
1250397-20181211155906223-1891069808.png

下面的代码的输出什么?
1250397-20181211155926396-703255412.png

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

#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() 多次调用

转载于:https://www.cnblogs.com/PyLearn/p/10103115.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《浅谈架构之路:前后端分离模式》 - 山人行 - 博客园

前言&#xff1a;分离模式 对前后端分离研究了一段时间&#xff0c;恰逢公司有一个大项目决定尝试使用前后端分离模式进行&#xff0c;便参与其中。该项目从2016年初立项至今&#xff0c;平平稳稳得度过&#xff0c;但也涌现出越来越多的问题&#xff0c;绝对不是说前后端分离模…

springboot快速集成swagger

今天技术总监说&#xff1a;小明&#xff0c;我们本次3.0改造&#xff0c;使用swagger2.0作为前后端分离的接口规范&#xff0c;它可以一键生成前后端的API,一劳永逸……小明&#xff1a;&#xff1f;&#xff1f;&#xff1f; Spring Boot 框架是目前非常流行的微服务框架&…

php curl处理get和post请求

CURL 是一个利用URL语法规定来传输文件和数据的工具&#xff0c;支持很多协议&#xff0c;如HTTP、FTP、TELNET等。最爽的是&#xff0c;PHP也支持 CURL 库。使用PHP的CURL 库可以简单和有效地去抓网页。你只需要运行一个脚本&#xff0c;然后分析一下你所抓取的网页&#xff0…

【Web】JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础。 - CSDN博客

前戏 前后端分离已成为互联网项目开发的业界标准使用方式&#xff0c;通过nginxtomcat的方式&#xff08;也可以中间加一个nodejs&#xff09;有效的进行解耦&#xff0c; 并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务&#xff08;多种客户…

MongoDB升级导致启动失败

起因 最近项目使用MongoDB,但是作为一个技术菜鸟&#xff0c;NoSQL数据库我还真不会用&#xff0c;于是我就在自己的阿里云服务器上安装了一个MongoDB4.0.9。 现象 但是当我使用yum -y update升级以后&#xff0c;MongoDB无法启动了&#xff0c;即使重装删除了MongDB的文件了还…

测者的测试技术手册:揭开java method的一个秘密--巨型函数

揭开java method的一个秘密&#xff1a;巨型函数 相信&#xff0c;很多人都不知道Java的Method的上限为64K。本文将超过这个上限的函数叫做巨型函数。 巨型函数的问题 1、如果代码超过了这个限制&#xff0c;Java编译器就报"Code too large to complier"的错误。 2、…

前端攻略系列(二) - 前端各种面试题

幸运且光荣的被老大安排了一个任务 - “去整理些前端面试题”。年前确实不是招人的好时候&#xff0c;所以我们前端团队经过了超负荷的运转&#xff0c;终于坚持过了春节。春节以后就开始招人啦&#xff0c;这套题考察的目标就是基础基础再基础&#xff0c;嘿嘿。 事先声明&…

html 初识

一、web请求流程模拟 python编写的简易服务器应用程序 import socketserversocket.socket() ip_port (127.0.0.1,8080) server.bind(ip_port) server.listen()while 1:conn, addr server.accept()from_browser_msgconn.recv(1024)print(from_browser_msg)conn.send(bHTTP/1.1 …

Iframe的那些事

在web开发中&#xff0c;经常会用到iframe&#xff0c;难免会碰到需要在父窗口中使用iframe中的元素、或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素 1、 格式&#xff1a;window.frames["iframe的name值"].document.getElementByIdx_x(…

异常处理try...catch...throw

C 引入了异常处理机制。其基本思想是&#xff1a;函数 A 在执行过程中发现异常时可以不加处理&#xff0c;而只是“拋出一个异常”给 A 的调用者&#xff0c;假定为函数 B。 拋出异常而不加处理会导致函数 A 立即中止&#xff0c;在这种情况下&#xff0c;函数 B 可以选择捕获 …

Makefile 中:= ?= += =的区别

是最基本的赋值: 是覆盖之前的值? 是如果没有被赋值过就赋予等号后面的值 是添加等号后面的值转载于:https://www.cnblogs.com/mingyunrangwozoudaoxianzai/p/10118039.html

原生JS写Ajax的请求函数

本文主要介绍了如何通过原生JavaScript封装ajax请求&#xff0c;文中给出了具体的实现代码和详细的解释&#xff0c;希望对你有所帮助。 一、JS原生Ajax ajax&#xff1a;一种请求数据的方式&#xff0c;不需要刷新整个页面&#xff1b; ajax的技术核心是 XMLHttpRequest 对象&…

软件工程--第十三周学习进度

第十三周代码量258 所花时间 6h博客量 2篇了解到的知识点 在寻找“水王”程序编写时&#xff0c;学习了一种新的设计思想&#xff0c;两两删除法&#xff0c;最后剩下的就是水王。这种设计思想&#xff0c;感觉可以用到多种编程&#xff0c;感觉很有意思。转载于:https://www.c…

如何使用 tf object detection

# 如何使用 tf object detectionhttps://juejin.i m/entry/5a7976166fb9a06335319080https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9https://towardsdatascience.com/building-a-toy-detector-with…

WEB文件上传之JQuery ajaxfileupload插件使用(二)

1.JQuery ajaxfileupload插件使用准备 下载地址&#xff1a; http://www.phpletter.com/DOWNLOAD/ 2.原理分析 ajaxfileupload也是利用iframe实现无刷新异步提交&#xff0c;与我的上一篇文章&#xff08;WEB文件上传之apache common upload使用&#xff08;一&#xff09;&…

Navicat安装激活

有条件的同学麻烦不要使用下面的激活步骤&#xff0c;仅供个人学习使用 。。。。。。 。。。。。。 。。。。。。 。。。。。。 一、去官网下载最新Navicat软件https://www.navicat.com.cn/download/navicat-premium 二、去下载激活脚本https://github.com/DoubleLabyrinth/nav…

WEB文件上传之apache common upload使用(一)

文件上传一个经常用到的功能&#xff0c;它有许多中实现的方案。 页面表单 RFC1897规范 http协议上传 页面控件(flash/html5/activeX/applet) RFC1897规范 http协议上传 页面控件(flash/html5/activeX/applet) 自定义数据规范 http协议上传 页面控件(flash/html5/act…

前端CSS学习笔记

一 CSS介绍 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;超文本标记语言&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。CSS不仅可以静态地修饰网页&#xff0c;还可以配合各种脚本语…

自律以自救

在一次逻辑思维的跨年晚会上&#xff0c;罗胖曾以「帝王」来形容活在当下移动互联网世界的人们。一个手机 App 可以让你足不出户&#xff0c;享受上百名厨师团队的服务&#xff0c;中饭想吃啥菜式、样品&#xff0c;输入框中一应俱全&#xff0c;光论规格&#xff0c;可能已超过…

Validform使用入门

Validform使用入门 1、引入css 请查看下载文件中的style.css&#xff0c;把里面Validform必须部分复制到你的css中&#xff08;文件里这个注释 "/*以下部分是Validform必须的*/" 之后的部分是必须的&#xff09;。之前发现有部分网友把整个style.css都引用在了页面…