try语句与异常处理
异常,是存在于运行时的反常行为,这些行为超出了函数正常功能的范围。当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。
throw
表达式:异常检测部分使用throw
表达式来表示它遇到了无法处理的问题,可称throw
引发了异常。
try
语句块:异常处理部分使用try
语句块处理异常。try
语句块以try
关键字开始,以一个或多个catch
子句结束,也称为异常处理代码。
异常类:用于在throw
表达式和相关的catch
子句之间传递异常的具体信息。
<stdexcepted>
定义了常见的异常类
exception | 最常见的问题 |
---|---|
runtime_error | 只有在运行时才能检测出的问题 |
range_error | 运行时错误:生成的结果超出了有意义的值域范围 |
overflow_error | 运行时错误:计算上溢 |
underflow_error | 运行时错误:计算下溢 |
logic_error | 程序逻辑错误 |
domain_error | 逻辑错误:参数对应的结果值不存在 |
invalid_argument | 逻辑错误:无效参数 |
length_error | 逻辑错误:试图创建一个超出该类型足最大长度的对象 |
out_of_range | 逻辑错误:使用一个超出有效范围的值 |
简单举例:在键盘上输出两个值,计算商,除数不能大于100。使用try
语句去捕获异常,catch
子语句为用户输出提示信息,询问是否重新输入并执行。
#include <iostream>
using namespace std;
int main()
{
int i, j;
while (cin >> i >> j)
{
try {
if (j == 0)
throw exception("j should not be 0");
if (j >= 100)
throw range_error("j should be smaller than 100");
cout << "i÷j=" << i / j << endl;
}
catch (exception exp)
{
cout << exp.what() << " \nTry Again? Enter y or n" << endl;
char c;
cin >> c;
if (!cin || c == 'n')
break;
}
catch (range_error rerr)
{
cout << rerr.what() << " \nTry Again? Enter y or n" << endl;
char c;
cin >> c;
if (!cin || c == 'n')
break;
}
}
system("pause");
return 0;
}
编写异常安全的代码非常困难,通常情况下,略过部分程序意味着某些对象处理到一半就戛然而止,从而导致对象处于无效或未完成的状态,或者资源没有被正常释放。