C/C++进阶学习笔记(三) 异常处理 try catch throw

来自https://www.hsli.top

本节介绍C++里面的异常处理

throw

throw可以理解为人为地抛出自定义的异常类型,可以用于代码中符合某些条件时刻意地制造一些异常信息抛出给控制台处理,比如如下例子:

1
2
3
4
Sales_item item1,item2;
if(!item1.same_isbn(item2)) //当item1和item2的ISBN不同时,抛出异常
throw runtime_error("Data must refer to same ISBN");
cout << item1 + item2 << endl;

try catch结构

try catch结构用于捕捉程序中会出现的异常,并对异常进行处理

try一下某句代码会不会有异常,如果有的话catch某种类型的异常,并进行处理

1
2
3
4
5
6
7
8
9
try{
可能出现异常的语句;
}
catch(异常种类1 异常变量名1){
处理第一种异常的语句;
}
catch(异常种类2 异常变量名2){
处理第二种异常的语句;
}

常见的异常种类

异常名 解释
exception 最常见的问题
runtime_error 运行时的错误,只有在运行时才能检测到
range_error 运行时的错误,生成的结果超出了可接受的值域
overflow_error 运行时的错误,计算上溢
underflow_error 运行时的错误,计算下溢
logic_error 逻辑错误,可在运行前检测到
domain_error 逻辑错误,参数的结果值不存在
invalid_argument 逻辑错误,不合适的参数
length_error 逻辑错误,试图生成一个超出该类型最大长度的对象
out_of_range 逻辑错误,使用一个超出有效范围的值

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// try_catch_throw.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <bitset>

using namespace std;

int main()
{
bitset<100> bs; //定义bitset,可以理解为位数组

for (size_t index = 0; index != bs.size(); ++index) //用size_t访问数组位,可以动态地自我改变index的类型,避免访问不到数组的高位元素
bs[index] = index;

//bs.to_ulong();

try
{
bs.to_ulong(); //bs的长度(100)大于ulong能存储的位数,此处会出现溢出异常
}
catch (runtime_error err) //catch runtime error
{
cout << err.what() << endl;
}

try
{
//throw logic_error("just kidding");
throw overflow_error("just kidding"); //这里人为地抛出异常供后面的语句来catch
}
catch (overflow_error err)
{
cout << "overflow error" << endl << err.what() << endl;
}
catch (logic_error err)
{
cout << "logic error" << endl << err.what() << endl;
}

system("pause");

return 0;
}
如果文章有用,请随意打赏