【C++基础】异常匹配与内建异常类

目录

  • 异常匹配
    • catch: 按异常类型匹配
    • 为何要使用异常类
  • 内建异常类
    • 标准库中的异常基类
    • 标准库中的异常类
    • 例1:vector下标访问越界out_of_range异常
    • 例2:内存分配失败bad_alloc异常
    • 例3:侧向转换失败bad_cast异常类
    • 几种情况,使用对应异常

异常匹配

catch: 按异常类型匹配

已知try是监视可能出现问题的代码,throw是扔出问题,catch是看扔出的问题是否和它的类型匹配,如果是匹配那么就抓住问题进行处理。
这里的类型使用传引用,避免拷贝浪费。

catch ( ExceptionType& parameter ) { /* 处理异常 */ }

若try{}中所抛异常类型与catch()的参数类型(ExceptionType)匹配,则进入catch块
若对异常对象的内容不感兴趣,可省略catch参数,只保留类型。
如:

catch ( ExceptionType& ) { /* 处理异常 */ }

举例:
f1()抛出整型异常。
f2()是要申请28G内存,如果电脑内存不够,执行代码会出错,抛出bad_alloc异常。这是C++规定的,new出现问题就会抛出bad_alloc异常。bad_alloc是C++异常类exception基类的派生类。

void f1() { throw 100; }
void f2() { for (int i = 1; i <= 100; i++) new int[70000000]; }

对于f1的两种处理:

try { f1(); }
catch (int) { //仅有类型cout << "Error" << endl;
}try { f1(); }
catch (int& e) { //类型+参数cout << e << endl;
}

对于f2的两种处理:
注意e.what()是exception类内部的一个虚函数,返回的是一个指针,指向一个字符串,包含了异常的解释信息。


try { f2(); } 
catch (bad_alloc) {cout << "new failed" << endl;
}
try { f2(); } 
catch (bad_alloc &e) {cout << "Exception: " << e.what() << endl;
}

为何要使用异常类

整数作为异常类型,只能获取整数的信息。
不使用异常类,则捕获的异常所能传递的信息量很少。

try {// ...
}
catch (int e) {//do something with e
}

使用异常类,则可以在抛出异常时传递很多信息,在捕获异常时接收这些信息。

class Beautiful {string name;string hometown;int    salary;string misdoing;
// ………… 
}
try {// ...
}
catch (Beautiful object) {//do something with object
}

内建异常类

标准库中的异常基类

exception 是标准库所有异常类的基类
使用异常类需要包括头文件 #include <exception>
class exception需要注意的部分如下:

exception(); // 构造函数
virtual const char* what(); //返回解释性字符串
what()返回的指针指向拥有解释信息的空终止字符串的指针。该指针保证在获取它的异常对象被销毁前,或在调用该异常对象的非静态成员函数前合法

标准库中的异常类

在使用所有标准库异常类的时候,都必须附加std名字空间。
在这里插入图片描述
runtime_error与logic_error的使用区别
来自wiki的解释:

逻辑错误:(有时称为语义错误)是程序中的一个错误,它会导致程序错误运行,但不会异常终止(或崩溃)。逻辑错误会产生非预期或不希望的输出或其他行为,尽管它可能不会立即被识别。
编译语言和解释语言都会出现逻辑错误。与有语法错误的程序不同,有逻辑错误的程序在语言中是有效的程序,尽管它的行为不符合预期。
运行时错误:一个错误在程序执行过程中发生的。相反,编译时错误发生在程序编译时。运行时错误表示程序中的错误或设计人员预期的问题,但却无能为力。例如,内存不足通常会导致运行时错误。

例1:vector下标访问越界out_of_range异常

vector有许多种访问元素的方式,其中[]下标访问不会做越界检查,at()会做越界检查。
在这里插入图片描述
在这里插入图片描述
我们将它截获
在这里插入图片描述

例2:内存分配失败bad_alloc异常

#include<iostream>
using namespace std;
int main()
{for( int i = 0; i < 10000; i++){auto *p = new long long int [70000];cout << i << "array" << endl;}return 0;
}

在这里插入图片描述
进行捕获

#include<iostream>
#include <exception>
#include <stdexcept>
#include <new>
using namespace std;
int main()
{try {for (int i = 0; i < 10000; i++){auto* p = new long long int[70000];cout << i << "array" << endl;}}catch (bad_alloc& e){cout << "exception " << e.what() << endl;}return 0;
}

exception bad allocation程序正常退出。

例3:侧向转换失败bad_cast异常类

创建基类student
创建派生类Undergraduate和Graduate
主函数中用dynamic_cast 将Undergraduate类型转换为Graduate类型.
dynamic_cast只有在做引用类型转换时候转换失败才会抛出异常。使用指针类型时,如果转换失败会返回nullptr

#include <iostream>
#include <exception>
#include <stdexcept>using namespace std;class Student {
public:Student() = default;virtual void foo() {};
};
class Undergraduate : public Student {};
class Graduate : public Student {};
int main()
{Undergraduate u;Graduate g;Student *s1 = &u;Student *s2 = &g;//正常操作,p指针不为nullptrGraduate *p = dynamic_cast<Graduate *>(s2);//转化不成功,p2指针为nullptrGraduate *p2 = dynamic_cast<Graduate *>(s1);if(p2 == nullptr){cout << "cast s1 to Graduate* failed " << endl;}else{cout << "cast s1 to Graduate* succeeded " << endl;}//引用,抛异常try{Graduate &r1 = dynamic_cast<Graduate &> (u);}catch (bad_cast & e){cout << "Exception: " << e.what() << endl;}return 0;
}

在这里插入图片描述

几种情况,使用对应异常

1、除法运算中除数为0;
:invalid_argument

2、在只读文件系统中以写模式打开一个文件流;
:filesystem::filesystem_error
3、 数组a的容量为5,向 a[5] 中写入数据;
:out_of_range

4、用 new 申请内存失败;
:bad_array_new_length
5、将A指针类型转换为B指针类型失败;
:bad_any_cast
6、将 1234567 这个整数存到一个 short int 类型的变量中(在32位C++编译器中编译)
:length_error

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小试---EF5.0入门实例1

现在做个小练习吧~~~ 第一步&#xff1a;首先新建一个数据库名字为Test;数据库里面只有一个表UserTable 脚本为&#xff1a; USE [master] GO /****** 对象: Database [Test] 脚本日期: 12/15/2013 18:51:54 ******/ CREATE DATABASE [Test] ON PRIMARY ( NAME NTest, F…

iScroll4 禁止select等页面元素默认事件的解决方法 转

iScroll4 禁止select等页面元素默认事件的解决方法起因在于onBeforeScrollStart : function(e){ e.preventDefault(); },这一行&#xff0c;iSroll禁止了事件的默认行为&#xff0c;导致select&#xff0c;option&#xff0c;textarea等元素无法点击。解决方法也很简单&#xf…

MPEG的完整形式是什么?

MPEG&#xff1a;运动图像专家组 (MPEG: Moving Picture Experts Group) MPEG is an abbreviation of Moving Picture Experts Group. It is a working group of authorities that is founded to establish standards for audio and video compression and transmission. The a…

安利一款倒计时插件---雨滴桌面

内容来自B站(搜索Rainmeter即可)&#xff0c;里面教程很多&#xff0c;因为视频看的有点麻烦&#xff0c;故进行了整理 一、下载安装包、解压、安装 免费下载连接&#xff0c;不需要积分 skin文件夹存放皮肤的一些配置文件&#xff0c;因为原本皮肤太low了 第二个是可执行文…

【C++基础】自定义异常类与多重捕获

目录自定义异常类构建过程例&#xff1a;Vec3D类的数组下标越界的异常类捕获多种无关异常不同的异常的捕获捕获派生异常异常处理的次序例子&#xff1a;多重捕获异常类catch块的参数类型可以不用引用类型吗?自定义异常类 自定义异常类通常由exception或其后代类派生。这样我们…

gprs 睡眠模式_GPRS的完整形式是什么?

gprs 睡眠模式GPRS&#xff1a;通用分组无线业务 (GPRS: General Packet Radio Service) GPRS is an abbreviation of General Packet Radio Service. It is a non-voice, high-level speed packet switching technology planned for GSM networks. On 2G and 3G cellular tran…

【C++基础】C++11的noexcept声明符 与 异常传播

目录C noexcept&#xff1a;1、用途2、用法1、noexcept声明符的用法&#xff1a;2、noexcept运算符的用法异常传播1、异常传播的定义2、异常传播中的规则3、异常传播的代价C noexcept&#xff1a; 1、用途 C11使用noexcept指明函数是否抛出异常&#xff1a; 若函数不抛异常&a…

CSS中的文本格式

CSS文字格式 (CSS text formatting) CSS text properties allow you to style your text in various ways very easily. Such as color, alignment, spacing, direction, etc. CSS文本属性使您可以轻松地以各种方式设置文本样式。 例如颜色 &#xff0c; 对齐方式 &#xff0c;…

CSS简写指南

1.margin 1.1 margin:1px 2px 3px(上 左右 下) 1.2 margin:2px 3px(上下 左右) 1.2 margin:1px 3px 2px 3px(上右下左) 2.padding(同上) 3.border border:1px red solid (border-width border-color border-style) 1 2 3border-width&#xff1a;1px 2px 3px; //最多可用四个值…

【C++基础】模板基础与函数模板

目录初识模板函数模板函数模板实例化显式实例化隐式实例化初识模板 求两个int、float、char类型的数据的最大值&#xff1a; C里面要这样写&#xff1a; int maxInt(int x, int y); double maxDouble(double x, double y); char maxChar(char x, char y);C使用函数重载&#…

TAFE的完整形式是什么?

TAFE&#xff1a;拖拉机和农用设备 (TAFE: Tractors and Farm Equipment) TAFE is an abbreviation of Tractors and Farm Equipment Limited. It is an Indian tractor manufacturer which is founded at Chennai in 1960. It is the second-largest tractor manufacturer in …

【C++基础】 类模板

类模板 模板是将类中某些类型变为泛型&#xff0c;从而定义一个模板。 如下&#xff1a; 类模板的语法 直接进行对比&#xff1a; 泛型化之前 泛型化之后类模板的实例化 注意&#xff1a;只要是对类模版进行实例化&#xff0c;编译器就会生成一个类&#xff01;&#xff0…

cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面

之前两个博客讲述了象棋的规格和工程文件之后&#xff0c;我们继续深入的从代码开始学习cocos2dx首先从程序入口main函数开始main函数int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow) {UNREFERENCED_PARAMETER(h…

【C++基础】模板参数与模板继承

模板参数 默认类型参数 函数参数可以设定一个默认值&#xff0c;我们现在可以对类模板的类型参数设定一个默认类型。 指定泛型Stack的默认类型参数为 int template<typename T int> class Stack{... };当我们这样定义一个对象时&#xff1a; Stack<> stack;使…

【C++基础】STL迭代器

已知&#xff1a; STL组成部分&#xff1a; 容器、迭代器、算法、函数对象、空间分配器 容器&#xff1a;用于保存一组数据&#xff0c;数据个体被称为元素 迭代器&#xff1a;用于遍历容器中的元素&#xff0c;容器都有自己专属的迭代器&#xff0c;只有容器才知道如何遍历自己…

office数据集dslr_DSLR的完整形式是什么?

office数据集dslrDSLR&#xff1a;数码单镜反光 (DSLR: Digital Single-Lens Reflex) DSLR is an abbreviation of digital single-lens reflex. It alludes to a digital camera which with the sensor of digital imaging merges optics and mechanism of single-lens reflex…

envs\TensorFlow2.0\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning 解决方案

import tensorflow后的完整报错&#xff1a; D:\Anaconda3\envs\TensorFlow2.0\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, it will b…

生产消费是什么设计模式_快速消费品的完整形式是什么?

生产消费是什么设计模式快消品&#xff1a;快速消费品 (FMCG: Fast-Moving Consumer Goods) FMCG is an abbreviation of Fast-Moving Consumer Goods which are also known as Consumer Packed Goods (CPG). These consumer packed goods allude to the products that are sol…

通过从全局和类内部重载operator new /delete来获取内存管理权

目录1、通过重载获得内存管理权2、容器的内存管理3、重载new、array new、replacement new&#xff0c;接管内存控制权1、重载全局::operator new / ::operator delete以及array版本2、在类里面去重载1、通过重载获得内存管理权 之前的几章学习&#xff0c;是红色的路线。此时…

sml完整形式_教资会的完整形式是什么?

sml完整形式教资会&#xff1a;大学教育资助委员会 (UGC: University Grants Commission) UGC is an abbreviation of the University Grants Commission. It is an organization established by the Indian Union government in agreement with the UGC Act 1956 under the Mi…