C++中的异常处理(一)

2023-11-16

异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入。异常存在于程序的正常功能之外,并要求程序立即处理。不能不处理异常,异常是足够重要的,使程序不能继续正常执行的事件。如果找不到匹配的catch,程序就调用库函数terminate。

 

如果不处理异常将会出现上图的效果。下面是处理异常的代码:

#include<iostream>
using namespace std;
int main()
{
	try
	{
	int a=3,b=0;
	int c=a/b;
	}
	catch(...)
	{
	}

	return 0;
}


这里catch后圆括号中的...指的是捕获所有异常。

 

抛出异常的时候,将暂停当前函数的执行,,开始查找匹配的catch子句。首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否其中之一与被抛出对象相匹配。如果找到匹配的catch,就处理异常:如果找不到,就退出当前函数(释放当前函数的内存并撤销局部对象),并继续在调用函数中查找。

 

如果对抛出异常的函数调用是在try块中,则检查与该try块相关的catch子句。如果找到匹配的catch就处理异常;如果找不到匹配的catch,调用函数也退出,并且继续在调用这个函数的函数中查找。

 

这个过程称之为栈展开,沿嵌套函数调用链继续向上,直到为异常找到一个catch子句。只要找到能够处理异常的catch子句,就进入该catch子句,并在该处理代码中继续执行。当catch子句结束的时候,在紧接在与该try块相关的最后一个catch子句之后的点继续执行。

 

在栈展开的时候,会退出某个函数,释放当前内存并撤销局部对象,这时会调用对象的析构函数,如果析构函数抛出异常,将会调用标准库terminate函数,强制整个程序非正常退出。所以析构函数应该从不抛出异常。

 

 

在查找匹配的catch期间,找到的catch不必是与异常最匹配的那个catch,相反,将选中第一个找到的可以处理该异常的catch。因此,在catch子句列表中,最特殊的catch必须最先出现,否则没有执行的机会。

 

进入catch的时候,用异常对象初始化catch的形参。因为基类的异常说明符可以捕获派生类的异常对象。如果异常对象是引用,则可以使用多态,调用基类的virtual将执行派生类的覆盖的函数。若catch的异常说明符是对象,则将派生类对象分割为它的基类对象。

 

异常的层次

异常的层次如下图:

 

exception类型所定义的唯一操作是一个名为what的虚成员,该函数返回const char* 对象,它一般返回用来在抛出位置构造异常对象的信息。因为what是虚函数,如果捕获了基类类型的引用,对what函数的调用将执行适合异常对象的动态类型的版本。

使用自定义异常

 

下面自定义异常类,继承自logic_error,MyException.h如下:

#if !defined(AFX_MYEXCEPTION_H__EB39C92B_B867_41AA_83A6_E614FD4AEC63__INCLUDED_)
#define AFX_MYEXCEPTION_H__EB39C92B_B867_41AA_83A6_E614FD4AEC63__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include<string>
#include<stdexcept>
class MyException:public std::logic_error  
{
public:
	MyException(std::string s,std::string myinfo);
	const char* what() const;
	virtual ~MyException();
private:
	std::string myinfo;
	

};

#endif // !defined(AFX_MYEXCEPTION_H__EB39C92B_B867_41AA_83A6_E614FD4AEC63__INCLUDED_)


MyException.cpp内容如下:

#include "MyException.h"

MyException::MyException(std::string s,std::string myinfo):logic_error(s)
{
	this->myinfo=myinfo;
}

MyException::~MyException()
{

}

const char* MyException::what() const
{
	return myinfo.c_str(); 
}


main函数所在的文件内容如下:

#include<iostream>
#include"MyException.h"
using namespace std;

void getException(bool b)
{
	if(b)
	{
		throw MyException("error","the parameter is true");
	}
}

int main()
{
	try
	{
		getException(1);
	}
	catch(logic_error &e)
	{
		cout<<e.what()<<endl;
	}
	return 0;
}


运行结果如下:

 

在MyException类中,覆盖了logic_error类中的virtual函数,在catch异常说明类型使用的是基类logic_error的引用,所以输出的结果是MyException中myinfo的内容。这就是多态在异常中的使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中的异常处理(一) 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 支付宝API支付使用文档--java《扫一扫支付》--demo但是封装高可用--改一改配置就拿走用!超详细!!有手就行!!!--spring +vue-调用支付宝的当面付的预创建接口

    支付宝API支付使用文档 java 扫一扫支付 demo但是封装高可用 改一改配置就拿走用 超详细 有手就行 上 修改官网配置类 一单成的博客 CSDN博客 阿丹 上一篇文章具体的描述和讲解了官方提供的配置类 以及如何使用注册开发沙箱 本篇
  • Linux系统图形界面,字符界面切换快捷键。启动图形界面服务。

    Ctrl Alt F3 启动字符界面 Ctrl Alt F7 启动图形界面 启动图形界面服务 cd etc init d service lightdm restart
  • 重装win8.1搜索不到 wifi

    这几天一直忙着研究装系统 毕竟自己是个小白 经常搞到深夜4点钟 今天终于算是有点眉目了 重新装完win8 1 电脑竟然搜索不到wifi 点开右下角那个图标 只有宽带连接这一个选项 于是到网上搜索 怎么解决 网上给了很多答案 基本都差不多 我
  • TCP/IP的三次握手、四次挥手

    本文通过图来梳理TCP IP协议相关知识 TCP通信过程包括三个步骤 建立TCP连接通道 传输数据 断开TCP连接通道 如图1所示 给出了TCP通信过程的示意图 上图主要包括三部分 建立连接 传输数据 断开连接 建立TCP连接很简单 通过三
  • Temporary failure in name resolution解决方法

    终端运行sudo su 输密码 vi etc reslov conf 输入i进入编辑模式 在文档末尾加入 nameserver 8 8 8 8 nameserver 114 114 114 114 按esc 输入 wq保存退出 执行 etc
  • 第八章 Oracle恢复内部原理(重置日志RESETLOGS)

    重置日志选项用于下列情形后的第一次打开数据库的时候 不完全恢复 基于备份控制文件的恢复 CREATE CONTROLFILE RESETLOGS 重置日志的最主要的作用就是丢弃不完全恢复中没有使用的重做日志并保证后续的恢复不再需要 为此 重
  • dll修复工具哪个比较好?修复工具介绍

    DLL 动态链接库 是Windows操作系统中非常重要的一部分 它们存储了各种软件应用程序所需的公共代码和数据 然而 随着时间的推移 电脑上的DLL文件可能会因为各种原因而损坏或丢失 导致系统出现错误 因此 修复DLL错误是一项非常重要的任
  • linux 下 C++ 与三菱PLC 通过MC Qna3E 二进制 协议进行交互

    西门子plc 有snap7库 进行交互 并且支持c 而且跨平台 但是三菱系列PLC并没有现成的开源项目 没办法只能自己拼接 我这里实现了MC 协议 Qna3E 帧 并使用二进制进行交互 pragma once include
  • HDU--1236:排名 (水题)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1236 2 程序源代码 HOJ 1236 排名 include
  • 软件测试框架理论知识

    一 软件测试的定义 1 软件测试的目标应该服从于软件项目的目标 软件测试通过更高效的方法和工具 提高软件开发的效率和质量 2 在规定的条件下 对软件进行审核 运行 评估 验证软件系统是否满足需求规格说明书 3 预防 发现 跟踪软件缺陷 提高
  • Unity篇:加快unity导入工程速度-Cache server链接

    1 已有unity打开 编辑窗口选择点击edit edit下拉展示的列表里打开Preferences 2 选择Cache server界面 Cache server Mode 选择remote 举例 输入192 168 15 131或者19
  • 目标检测中的mAP(mean Average Precision)快速理解

    前言 最近开始接触目标检测 object detection 但是对于衡量算法好坏的mAP Mean Average Precision 并不太理解 经过了一番整理 下面我们就来看看什么是mAP 在目标检测算法中 像是Faster R CN
  • vue上下滑动(仿高德)

    效果图 需求 一个页面底部对应一块区域 底部的区域可以上下滑动到顶部 可以来回上下滑动延伸 如上所述 代码
  • C++实现行列式的相关操作

    目录 一 前言 二 行列式运算操作集 1 概览 2 行列式的定义 3 行列式的输出与输入 4 行列式行与行 列与列的相加 5 行列式的行交换与列交换 6 行列式的行提取公因数与列提取公因数 7 行列式系数清零恢复 8 判断一个行列式是否是三
  • 无须SMTP服务器中转直接将电子邮件发送到对方邮箱

    前言 大家一定熟悉Foxmail中的 特快专递 它能直接将电子邮件发送到对方的邮件服务器中 而不需要经过SMTP服务器中转 这样做有什么好处 第一 发送速度比较快 不需要等SMTP服务器对邮件进行查毒 派发 验证 第二 你可以及时掌握邮件是
  • Spring(一)之控制反转和依赖注入

    1 sts下载 https spring io tools3 sts all 参考博客 https blog csdn net m0 37920381 article details 79972438 2 简介 spring是一个开源框架
  • JQuery针对select下拉框的各项操作

    JQuery针对select下拉框的各项操作 select id change function code 为Select添加事件 当选择其中一项时触发 var checkText select id find option selecte
  • union(联合)注入和布尔注入

    没有很快乐 也没有不快乐 好像不该这样 但也只能这样 成长也许如此 行于奔溃边缘又慢慢自愈吧 网易云热评 一 union联合注入 1 select 1 2 3会生成一张临时表 表中的字段为查询的字段 内容也是查询的字段 2 select 1
  • 什么是Chat GPT?我们能用它来干啥?

    Chat GPT是一款基于人工智能技术的自然语言处理模型 由OpenAI团队开发 它能够通过机器学习技术从海量文本数据中学习语言知识 实现自然语言生成 对话生成和语言理解等功能 使得机器能够更加智能地理解和使用自然语言 Chat GPT的应
  • C++中的异常处理(一)

    异常就是运行时出现的不正常 例如运行时耗尽了内存或遇到意外的非法输入 异常存在于程序的正常功能之外 并要求程序立即处理 不能不处理异常 异常是足够重要的 使程序不能继续正常执行的事件 如果找不到匹配的catch 程序就调用库函数termin