异常处理

异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。

概念

  • throw表达式

    异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发了异常。

  • try语句块

    异常处理部分使用try语句块处理异常。try语句块以关键字try开头,并以一个或多个catch子句结束。

标准异常

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
exception  //最常见的问题
runtime_error  //只有在运行时才能检测出的问题
range_error  //运行时错误: 生成的结果超出了有意义的值域范围
overflow_error //运行时错误: 计算上溢
underflow_error //运行时错误: 计算下溢
logic_error //程序逻辑错误
domain_error //逻辑错误: 参数对应的结果值不存在
invalid_argument //逻辑错误: 无效参数
length_error //逻辑错误: 试图创建一个超出该类型最大长度的对象
out_of_range //逻辑错误: 使用一个超出有效范围的值

我们只能以默认初始化的方式初始化 exceptionbad_alloc , bad_cast ,不允许为这些对象提供初始值。而其他异常类型必须用 string 对象或者C风格字符串初始化。

例子

 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
#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
	int num1, num2;
	while (cin >> num1 >> num2)
	{
		try
		{
			if (num2 == 0)
			{
				throw range_error("除数不能为0");
			}
			cout << num1 / num2 << endl;
		}
		catch (range_error err)
		{
			cout << err.what() << "\n Try again?Enter y or n" << endl;
			char c;
			cin >> c;
			if (c == 'n')
				break;
		}
	}
}

每个标准库都定义了名为 what 的成员函数,这些函数没有参数,返回值是C风格字符串(const char*)。

异常发生时,寻找处理代码的过程与调用函数的过程恰好相反,异常抛出时,首先搜索抛出该异常的函数,若没找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找。以此类推。当最终没有找到,系统会调用 terminate 函数并终止程序执行。同理,如果一段程序没有try语句且发生异常,系统会调用terminate函数并终止当前程序的执行。

updatedupdated2022-03-292022-03-29