标准库里的异常类

C++标准提供了一组标准异常类,这些类以基类 Exception 开始,标准程序库抛出的所有异常,都派生于该基类,这些类构成如图所示的异常类的派生继承关系,该基类提供一个成员函数 what(),用于返回错误信息(返回类型为 const char*)。在 Exception 类中,what() 函数的声明如下:

1 virtual const char* what() const whrow();

该函数可以再派生类中重定义。

下表中列出了各个具体异常类的含义以及定义他们的头文件。runtime_error 和 logic_error 是一些具体的异常类的基类,他们分别表示两大异常,logic_error 表示那些可以再程序中被预先检测到的异常。也就是说如果小心的编写程序,这类异常能够避免;而 runtime_error 则表示那些难以被预先检测的异常。

一些编程语言规定,只能抛掷某个类的派生类(如Jave中允许抛掷的类必须派生自Exception类),C++虽然没有这项强制的要求,但任然可以这样实践。例如,在程序中可以使得所有抛出的异常皆派生自 Exception (或直接抛出标准程序库提供的异常类型,或者从标准程序库提供的异常类派生出新的类),这样会带来很多方便。

logic_error 和 runtime_error 两个类及其派生类,都有一个接受 const string & 型参数的构造函数。在构造异常对象时需要将具体的错误信息传递给该参数,如果调用该对象的 what() 函数,就可以得到构造时提供的错误信息。

out_of_range 用法举例, what()方法可以将异常 out_of_range 后边的内容返回:

 1 #include <iostream>
2 #include <stdexcept>
3
4 using namespace std;
5
6 class Student
7 {
8 public:
9 Student(int age);
10
11 private:
12 int age = 0;
13 };
14
15 Student::Student(int age)
16 {
17 if (age > 150)
18 {
19 throw out_of_range("年龄输入出错");
20 }
21 this->age = age;
22 }
23
24 int main()
25 {
26 try
27 {
28 Student* role = new Student(151);
29 }
30 catch (const out_of_range& err)
31 {
32 cout << "捕捉到异常:" << err.what() << endl;
33 }
34
35 return 0;
36 }

程序运行结果:

  捕捉到异常:年龄输入出错

bad_alloc 用法举例,用上边的代码,做一个内存分配溢出的异常,bad_alloc 与其他的用法有些不同,你不需要在 try 包含的方法中去手动抛出,只需要直接在 try 块后的 catch 后接收匹配便可,他会自动接收 try 内分配内存导致的报错:

 1 #include <iostream>
2 #include <exception>
3
4 using namespace std;
5
6 class Student
7 {
8 public:
9 Student(int age);
10 ~Student();
11
12 private:
13 int age = 0;
14 int* m_space = NULL;
15 };
16
17 Student::Student(int age)
18 {
19 if (age > 150)
20 {
21 printf("年龄输入出错");
22 }
23 this->age = age;
24 m_space = new int[1024 * 1024 * 100];
25 }
26
27 Student::~Student()
28 {
29 if (m_space)
30 {
31 delete[] m_space;
32 }
33 }
34
35 int main()
36 {
37 try
38 {
39 for (int i = 0; i < 1024; i++)
40 {
41 Student* role = new Student(18);
42 }
43 }
44 catch (bad_alloc & err)
45 {
46 cout << "捕捉到异常" << err.what() << endl;
47 }
48
49 return 0;
50 }

程序运行结果:

  捕捉到异常bad allocation

1. 异常处理的三个关键字

点击查看

2. 异常处理的基本语法

点击查看

3.异常处理接口声明

点击查看

4.异常类型的生命周期

4.1 throw 基本类型:

点击查看

4.2 throw 字符串类型:

点击查看

4.3 throw 类类型异常:

点击查看

5.异常和继承

点击查看

6.异常处理的基本思想

点击查看

7.标准库里的异常类

点击查看

C++异常之七 标准库里的异常类的更多相关文章

  1. 【Python】类和对象、继承、使用文件、存储、异常、标准库(不懂)

    当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self ...

  2. [并发并行]_[C/C++]_[C++标准库里的线程安全问题]

    场景 1.写普通的程序时, 经常会使用cout来做输出, 每个进程只有一个控制台, 如果多线程调用cout时会出状况吗? 2.之所以研究cout会不会在并发下调用有问题, 是因为曾经有一个bug的崩溃 ...

  3. C++标准库里自带的数值类型和字符串互相转换函数

    需要包含头文件 #include <string> 数值类型转成string类型: string to_string(int val); string to_string(unsigned ...

  4. Python标准库的threading.Thread类(转自别人的翻译)

    这个类表示在单独的控制线程中运行的活动.有两种方法可以指定这种活动,给构造函数传递回调对象,或者在子类中重写run() 方法.其他方法(除了构造函数)都不应在子类中被重写.换句话说,在子类中只有__i ...

  5. Swift中如何化简标准库中冗长的类实例初始化代码

    可能有些童鞋并不知道,在Swift中缩写点符号对于任何类型的任何static成员都有效. 我们实际写一个例子看一下: import UIKit class CFoo{ static let share ...

  6. C++标准库第二版笔记 3 和异常的理解 1

    C++标准库第二版笔记 3 和异常的理解 1 差错和异常(error and exception)的处理 标准异常类(exception class) 定义于 分为: 1.语言本身支持的异常 2.标准 ...

  7. C++ 异常机制分析(C++标准库定义了12种异常,很多大公司的C++编码规范也是明确禁止使用异常的,如google、Qt)

    阅读目录 C++异常机制概述 throw 关键字 异常对象 catch 关键字 栈展开.RAII 异常机制与构造函数 异常机制与析构函数 noexcept修饰符与noexcept操作符 异常处理的性能 ...

  8. Java 里的异常(Exception)详解

    作为一位初学者, 本屌也没有能力对异常谈得很深入.   只不过Java里关于Exception的东西实在是很多. 所以这篇文章很长就是了.. 一, 什么是java里的异常   由于java是c\c++ ...

  9. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

随机推荐

  1. ntpd配置时间同步服务器

    修改同步服务器的配置文件/etc/ntp.conf ,删除所有的内容,添加 restrict default nomodify server 127.127.1.0 # local clock fud ...

  2. mysql之数据库备份

    1.可视化工具Navicat for mysql进行操作数据库备份 (1)备份数据库 (2)将备份的数据库进行加载

  3. Flink处理函数实战之五:CoProcessFunction(双流处理)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. day96:flask:flask-migrate&flask-session&蓝图Blueprint&蓝图的运行机制

    目录 1.flask-migrate 2.flask-session 3.蓝图:Blueprint 4.蓝图的运行机制 1.数据库迁移:flask-migrate 1.Flask的数据库迁移 在开发过 ...

  5. 巧妙运用Camtasia制作爱豆的动感影集

    对于追星族来说,收集爱豆的图片.视频是日常必做的事情,而对于进阶型的追星族来说,为爱豆自制各种精美的视频.影集等,会让自己追星之路显得更为充实. 我们可以借助Camtasia教程录制软件为爱豆制作各种 ...

  6. Vegas教程:教你制作热门人物消失特效

    在许多电影中,我们经常会看到一些人物逐渐消失的情景,这种情景一般都是通过后期技术处理的结果,现实生活中根本不可能出现,那么这种特效是如何制作处理的呢?下面小编就来教大家如何用Vegas    Pro ...

  7. Java中类加载的过程

    类加载过程 这里的加载过程是严格按照加载开始顺序进行的,注意是加载开始而不是加载完成.也就是有可能会有两个或几个阶段是同时进行的. 比如下面提到的验证过程中的符号引用验证是在解析阶段开始之后进行. 加 ...

  8. 【xmind converse excel】测试用例定制化小工具

    背景 公司使用jira, jira写测试用例,jira可以通过execl导入进jira, 生成测试用例,但是模板很不统一,如果只是再execl中修改,又觉得及其的麻烦,所以写了一个xmind 转化为定 ...

  9. 【GIT】命令笔记

    1.将本地代码提交到github等仓库 1.创建仓库省略 2.切换到本地需要上传的地址 :初始化仓库 git init 3.配置git,告诉git你是谁 git config --global use ...

  10. 【应用服务 App Service】解决无法从Azure门户SSH登录问题

    问题描述 中国区的Azure App Service(应用服务)已经支持创建Docker并选择Linux环境.在使用中,我们可以继续通过kudu站点的方式登录查看站点的一些日志及部署文件.它的登录方式 ...