1. 概述
所谓的异常(Exceptions)是程序在运行时可能出现的会导致程序运行终止的错误。比如系统资源不足。如内存不足,不可以动态申请内存空间;磁盘空间不足,不能打开新的输出文件,等。 用户操作错误导致运算关系不正确。如出现分母为0,数学运算溢出,数组越界,参数类型不能转换,等。
异常有以下的一些特点:
偶然性。程序运行中,异常并不总是会发生的。
可预见性。异常的存在和出现是可以预见的。
严重性。一旦异常发生,程序可能终止,或者运行的结果不可预知。
C++中异常是通过抛出(throw)对象而引发(raise)的。该对象的类型决定应该激活那个处理代码。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。
2. 如何抛出异常
通过在有效的C++ 表达式前面加上关键字throw 就可以从函数中抛出异常。当出现异常时,就会对表达式进行复制,然后将副本传递给当前正在执行的函数。在这种情况下,函数的返回值的返回类型会被完全忽略并且将函数中语句不在执行。
例如,下面的throw 语句是有效的
throw 0;
int x=1;
throw x;
throw x+4;
throw String(“execption”);
当然,如果用户自定义的对象被抛出,就要通过调用类的复制构造函数对其进行复制。
3. 如何捕获异常
如国该异常被捕获了,那么该函数就应该编写try/catch 处理程序:
try
{
//your code here
}
catch(// one argument here)
{
//your code here
}
catch(// one argument here)
{
//your code here
}
说明:执行throw的时候,不会执行跟在throw 的语句,而是将控制从throw转移到匹配的catch,该catch 可以同一个函数中局部的catch。catch()的参数要与抛出异常的类型一致。例如
try
{
int x=1;
throw x;
}
catch(const int &x )
{
//your code here
}
这里抛出类型是int,因此捕获的类型也是int.当然你也可以可以写成catch(...),...不是省略号,而是C++里的一种标识符,catch(...)的意思是捕获所有异常。
4. 异常处理的一个简单的示例(处理分母为0的异常)
#include "stdafx.h"
#include<iostream>
using namespace std;
double get_quotient(int numerator,int denominator)
{
if(denominator==0)
{
throw "zero denominator"; //抛出分母为0的情况
}
return static_cast<double>(numerator)/denominator;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"please input a numerator and denominator:";
int num,den;
while(!(cin>>num>>den).eof())
{
try
{
cout<<"quotient is :"<<get_quotient(num,den)<<endl;
}
catch(char const *error)// 捕获抛出的异常 要和抛出的类型一致
{
cout<<error<<endl;
}
}
return 0;
}