C++中的异常处理
开发工具与关键技术:Visual Studio、C++
作者:张国军
撰写时间:2019年04月25日
程序设计的要求之一就是程序的健壮性。希望程序在运行时能够不出或者少出问题。但是,在程序的实际运行时,总会有一些因素会导致程序不能正常运行。异常处理(Exception Handling)就是要提出或者是研究一种机制,能够较好的处理程序不能正常运行的问题。
异常(Exceptions)是程序在运行时可能出现的会导致程序运行终止的错误。
编译系统检查出来的语法错误,导致程序运行结果不正确的逻辑错误,都不属于异常的范围。
异常是一个可以正确运行的程序在运行中可能发生的错误。
常见的异常,如:
系统资源不足。如内存不足,不可以动态申请内存空间;磁盘空间不足,不能打开新的输出文件,等。
用户操作错误导致运算关系不正确。如出现分母为0,数学运算溢出,数组越界,参数类型不能转换,等。
异常有以下的一些特点:
偶然性。程序运行中,异常并不总是会发生的。
可预见性。异常的存在和出现是可以预见的。
严重性。一旦异常发生,程序可能终止,或者运行的结果不可预知。
对于程序中的异常,通常有三种处理的方法:
不作处理。很多程序实际上就是不处理异常的。
发布相应的错误信息,然后,终止程序的运行。在C语言的程序中,往往就是这样处理的。
适当的处理异常,一般应该使程序可以继续运行。
一般来说,异常处理(Exception Handling)就是在程序运行时对异常进行检测和控制。
而在C++中,异常处理(EH)就是用C++提供的try-throw-catch的模式进行异常处理的机制。
那么我们下边看一个简单的例子:
比如我们这个简单的例子就是判断剩下的钱是否还够我们需要购买物品的价格,单我们的钱不够购买我们需要购买的物品的时候,那么它将会throw抛出一个异常“剩下的钱不够购买此物品!”
#include <iostream>
using namespace std;
void main() {
try
{
unsigned int remain = 1000;
unsigned int consumption;
cout << "请输入价格:";
cin >> consumption;
while (true)
{
remain -= consumption;
cout << endl << "剩下" << remain << endl;
cout << "请输入价格:";
cin >> consumption;
if (consumption > remain) {
throw exception("剩下的钱不够购买此物品!");
break;
}
}
}
catch (const std::exception& a)
{
cout << a.what();
}
}
就如我们这里,我们有1000块钱,我们第一个购买了一个一百元的物品剩下九百块钱,第二个呢购买了五百块钱的物品剩下四百块钱,第三个呢购买了一个三百块钱的物品,剩下一百块钱,当我们再想购买大于一百块钱的物品的时候那么它就会抛出一个异常,我们剩下的钱不够购买物品。
例2:程序将连续地输入两个实数,通过调用函数,返回这两个数相除的商。并且要注意除数不能为0。
//例13.1 用一般的方法处理除法溢出
#include <iostream>
#include <stdlib.h>
using namespace std;
double divide(double a, double b)
{
if (b == 0) //检测分母是不是为0
{
cout << "除数不可以等于0 !" << endl;
abort(); //调用abort函数终止运行
}
return a / b;
}
void main()
{
double x, y, z;
cout << "输入两个实数 x 和 y :";
while (cin >> x >> y)
{
z = divide(x, y);
cout << "x 除以 y 等于 " << z << "\n";
cout << "输入下一组数 <q 表示结束>: ";
}
cout << "Bye!\n";
}