标准库里的异常类

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. mysql之数据锁

  2. 使用进程池模拟多进程爬取url获取数据,使用进程绑定的回调函数去处理数据

    1 # 使用requests请求网页,爬取网页的内容 2 3 # 模拟使用进程池模拟多进程爬取网页获取数据,使用进程绑定的回调函数去处理数据 4 5 import requests 6 from mu ...

  3. C#委托的详细总结

    1.什么是委托 委托是C#中一种类型,它的作用相当于C语言中的函数指针,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用if- ...

  4. 教你用Vegas Pro制作视频的遮罩转场特效

    很多小伙伴在接触了Vegas之后,都想利用Vegas制作出各种酷炫的特效.小编也是一样. 今天,小编就和大家分享一下,小编近期学会的遮罩转场特效. 首先想要制作遮罩转场效果,需要的素材有:至少两个图片 ...

  5. 网络系列之 cookie增删改查(封装)

    什么是cookie 呢?简单来说,这个小东西,会记录你的 浏览器 浏览习惯,或 账号密码等, 以便于提高用户的体验感. 举个例子: 你们有没有发现,去淘宝一些购物网站, 你搜索了 椅子, 挑选了一会椅 ...

  6. 25. K 个一组翻转链表

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.示例 :给定这个链表: ...

  7. ios中多线程GCD NSOperation NSThread 相关的操作解析

    //1.GCD 继承自C语言 优点 简单方便 //开启一个子线程处理耗时的操作 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIO ...

  8. kafka 消息存储分析

    kafka 可以支持海量数据发送,轻轻松松QPS过十万,如果JVM内存存储这一块如果不够优秀,根本无法支持这么庞大的QPS. 存储架构(这里这是落地数据,并木有涉及到序列化发送数据到broker) R ...

  9. Java集合【3】-- iterable接口超级详细解析

    目录 iterable接口 1. 内部定义的方法 1.1 iterator()方法 1.2 forEach()方法 1.3 spliterator()方法 总结 iterable接口 整个接口框架关系 ...

  10. Python基于Socket实现简易多人聊天室

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...