C++异常处理

2023-10-30

(一)异常处理定义

异常是程序在执行期间产生的问题,任何事物,任何情况都可以当做异常,错误算是异常的一种 。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。

     异常处理机制: 暂时性不做处理,抛出异常,留给使用者去处理。

异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw

 标准库中的异常:

 

注意: 所有抛出的异常,必须要处理,如果不做处理,引发异常识,程序调用abort函数终止程序  

(二)异常处理基操

抛出异常: throw 抛出的东西一定是一个值

检查异常:try:try块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。

捕获处理异常:catch在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。

try和catch必须一起出现,并且各自的{}不能省略

 基本语法格式:try { // 保护代码 }catch(...) { // 能处理任何异常的代码 }

  如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。

 相关代码:

#include <iostream>
using namespace std;
int Div(int a, int b) 
{
	//正常写程序 有问题立刻处理
	//if (b == 0) 
	//{
	//	cout << "除数不能为0" << endl;
	//	return 0;
	//}
	if (b == 0)
		throw 0;	//		
	return a / b;
}

int main() 
{
	//Div(1, 0);   //调用abort函数终止程序
	try 
	{
		cout << "测试.....1" << endl;
		Div(1, 0);
		cout << "测试.....2" << endl;
	}
	catch (double)	    
	{
		cout << "double:除数不能为零" << endl;
	}
	catch (int)  //捕获int类型异常   
	{
		cout << "int:除数不能为零" << endl;
	}
	//error C2312: “int”: 由“int”在行 28 上捕获,不能写两个相同的
	//catch (int)
	//{
		//cout << "int:除数不能为零" << endl;
	//}
	return 0;
}

(三) C++ 标准的异常

C++ 提供了一系列标准的异常,定义在 <exception> 中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的,如下所示:

下表是对上面层次结构中出现的每个异常的说明: 

异常 描述
std::exception 该异常是所有标准 C++ 异常的父类。
std::bad_alloc 该异常可以通过 new 抛出。
std::bad_cast 该异常可以通过 dynamic_cast 抛出。
std::bad_exception 这在处理 C++ 程序中无法预期的异常时非常有用。
std::bad_typeid 该异常可以通过 typeid 抛出。
std::logic_error 理论上可以通过读取代码来检测到的异常。
std::domain_error 当使用了一个无效的数学域时,会抛出该异常。
std::invalid_argument 当使用了无效的参数时,会抛出该异常。
std::length_error 当创建了太长的 std::string 时,会抛出该异常。
std::out_of_range 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。
std::runtime_error 理论上不可以通过读取代码来检测到的异常。
std::overflow_error 当发生数学上溢时,会抛出该异常。
std::range_error 当尝试存储超出范围的值时,会抛出该异常。
std::underflow_error 当发生数学下溢时,会抛出该异常。

exception类组成:

  • what方法 用来返回异常信息的字符串

       相关代码:

#include <iostream>
#include <exception>

using namespace std;

class Error :public exception 
{
public:
    //virtual char const* what() const
    //{
    //    return "Error";
    //}
    Error() :exception("Error") {}
private:
};
void  printTest() 
{
    throw Error();
}

int main() 
{
    try 
    {
        printTest();
    }
    catch (Error& object) 
    {
        cout << object.what() << endl;
    }
	return 0;
}

(四)异常处理的小技巧

  1. 局部控制能处理的问题,不需要异常机制

  2. 千万不要在析构函数抛出异常(作死操作)

  3. 构造函数存在问题,也不要次啊用异常机制

  4. 自己写异常类 没必要都是继承exception,可以适当根据具体问题,继承相应子类即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++异常处理 的相关文章

  • boost::asio + std::future - 关闭套接字后访问冲突

    我正在编写一个简单的 TCP 客户端来发送和接收单行文本 异步操作由 std future 处理 以便于超时阻塞查询 不幸的是 我的测试应用程序在破坏服务器对象时因访问冲突而崩溃 这是我的代码 TCP客户端 hpp ifndef TCPCL
  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • TESTNG框架

    TestNG是一个设计用来简化广泛的测试需求的测试框架 从单元测试 隔离测试一个类 到集成测试 测试由有多个类多个包甚至多个外部框架组成的整个系统 例如运用服务器 编写一个测试的过程有三个典型步骤 编写测试的 业务逻辑并在代码中插入Test
  • Typora 含多图片笔记快速上传到 CSDN 上发表

    Typora 含多图片笔记快速上传到 CSDN 上发表 适用场景 解决方案 具体步骤 适用场景 在 Typora 里面记笔记 上传的图片是本地保存的 如果要将笔记上传到 CSDN 上发表的话 图片得一张一张地拖拽非常麻烦 解决方案 Typo
  • TypeScript快速上手

    简介 参考文档 https ts xcatliu com 阮一峰typescript入门教程 TypeScript JavaScript With Syntax For Types typescriptlang org typescript
  • Ubuntu上搭建RK3588开发环境

    目标 Ubuntu上搭建RK3588开发环境 并成功运行 测试其芯片性能 可参考连接 https wiki t firefly com zh CN Core 3588J started html x 16号之前完成打包Ubuntu系统 差一
  • String[] 插入元素数据

    String pIdStr request getParameter ids String projectIdList pIdStr split List
  • Mybatis报错mapkey is required解决方案

    Mybatis报错mapkey is required解决方案 问题背景 解决方案 总结 Lyric 几天都没有喝水也能活 问题背景 因为使用了mybatisX插件 导致检查报错mapkey is required 解决方案 1 关闭myb
  • vue中下载文件使用file-saver,文件错误excel无法打开

    最近使用到了file saver下载文件 通过axios调接口拿文件数据 再通过file saver下载文件 但就在我成功下载文件并打开时 提示这个信息 主要的原因就是没有设置响应的文件流类型为 blob 加上后就可以打开了
  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • 基于flask做的用户注册界面一(无后台接收,无数据库)

    1 init py文件界面 再此声明 完全是个人问题 一般 init py不能这样用 init py文件 from flask import Flask app Flask name debug True import apps view
  • springboot(2.1.1.RELEASE)启用jdk动态代理(默认启用cglib)的方法

    大前提 该类必须实现了某个接口 其他类使用注解引用该类时 必须基于其实现的接口类型注入 否则注入不成功 方式1 启动类上注解如下设置 SpringBootApplication exclude AopAutoConfiguration cl
  • 两幅有偏差的影像同坐标的地物不一定一样

    第一幅图上 如果经纬度100 100上是只狗 那么另外一个图上同经纬度不一定有狗了 是有偏差的
  • centos 6.5 安装JDK 7

    安装说明 系统环境 centos 6 3 安装方式 rpm安装 软件 jdk 7 linux x64 rpm 检验系统原版本 root admin java version 进一步查看JDK信息 root admin rpm qa grep
  • java中字节流的分类都有哪些_Java------字节流和字符流(I)

    字节流 读写字节文件 通常使用字节流 如 二进制文件 jpg mp3 avi exe com dll windows平台的执行文件 exe com dll 字符流 读写字符文件 通常使用字符流 如 txt java css doc html
  • MAE入局多模态分析,CMU联合微软发布仅需文本监督的视觉语言新模型VLC

    原文链接 https www techbeat net article info id 3677 作者 seven 论文链接 https arxiv org abs 2205 09256 代码链接 https github com guil
  • 使用vite快速安装项目(SyntaxError:Unexpected reserved word?)

    前提环境 需要安装nodejs和npm 并且nodejs版本必须在16以上 安装vite 打开命令窗口 执行命令 npm install vite g 1 2 如果执行该命令报错 SyntaxError Unexpected reserve
  • gjb1188a

    unsigned short VerifyWord1188A unsigned short data 32 unsigned long len unsigned char i 0 unsigned short verifyWord 0 fo
  • numpy的相关使用方法

    20210211 引言 之前的时候 一些关于numpy的内容都记录在另一篇文章中 pandas及numpy 常用操作 里面大部分都是pandas的操作 但是最近使用numpy比较多了之后 也积累了一些内容 所以这里专门记录一下 内容列表 拼
  • 计算机二级题目之数组学习

    1 下列给定程序中 函数fun的功能是 用冒泡法对6个字符串按由小到大的顺序进行排序 请改正程序中的错误 使它能得出正确的结果 include
  • (16)pandas多层级索引的访问

    import numpy as np import pandas as pd from pandas import Series DataFrame 内容 Series数组 DataFrame数组 构建一个多层级索引 构造一个多维索引 in
  • C++异常处理

    一 异常处理定义 异常是程序在执行期间产生的问题 任何事物 任何情况都可以当做异常 错误算是异常的一种 C 异常是指在程序运行时发生的特殊情况 比如尝试除以零的操作 异常处理机制 暂时性不做处理 抛出异常 留给使用者去处理 异常提供了一种转