标准库里的异常类

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. flink1.10版local模式提交job流程分析

    1.WordCount程序实例 2.本地监听9000端口后测试结果 3.job提交流程 4.local模式执行StreamGraph任务 5.流程分析 flink job提交流程个人理解可以大致分为定 ...

  2. 20201124-web方向-命令执行-RCE

    参考链接:https://www.cnblogs.com/wangtanzhi/p/12311239.html RCE: 英文全称:remote command / code execcute 分别为 ...

  3. 这些Servlet知识你一定要知道,金九银十大厂面试官都爱问

    前言 Servlet是服务器端的Java应用程序,可以生产动态Web页面.透过JSP执行过程可以知道JSP最终被编译成一个.class文件,查看该文件对应的Java类,发现该Java类继承自org.a ...

  4. JUC并发工具包之Semaphore

    目录 Semaphore (JDK) Timed Semaphore (Apache Commons) Semaphore vs. Mutex CodeRepo Semaphore (JDK) 我们使 ...

  5. PHP 递归删除目录中文件

    /** * 递归删除目录中文件 * @param $pathname * @return bool */public static function delDir($pathname)//要删除的目录 ...

  6. Jmeter生成HTML测试报告

    jmeter轻便小巧,运行速度快,但是缺少直观的可视化测试报告,并且生成测试报告操作稍微有点麻烦. GUI界面没有生成测试报告的功能,只能使用命令行生成测试报告.这里需要提到一个jtl的文件,它是生成 ...

  7. open()和with open() as的区别

    2020-03-18  20:37:55 open()和with open() as的区别 1 file = open("test.txt","r") 2 fo ...

  8. Java基础教程——接口

    接口 接口只是一种约定.--Anders 接口定义了一种规范--多个类共同的公共行为规范. 对于接口的实现者--规定了必须向外提供哪些服务 对于接口的调用者--规定了可以调用哪些服务,如何调用这些服务 ...

  9. pip递归安装报错继续安装

    使用命令pip freeze > requirements.txt导出项目依赖包之后,使用pip -r requirements.txt的时候可能会出现一些包安装出错,但是安装一旦出错,安装就会 ...

  10. mark一下2020已经阅读的书单专栏和源码

    1.书籍 已经阅读: 深度工作 代码整洁之道 正在阅读: 敏捷软件开发 程序员修炼之道 程序员思维 计划阅读: 人月神话 数据密集型系统设计 如何阅读一本书 卓有成效的管理者 算法 第四版 sprin ...