文档介绍:该【异常处理的基本语法异常处理的使用标准C 】是由【guwutang】上传分享,文档一共【26】页,该文档可以免费在线阅读,需要了解更多关于【异常处理的基本语法异常处理的使用标准C 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。前言
一个优秀的软件应该具有很强的容错能力。C++语言能够提供异常处
理机制使得当某个函数出现异常时,能够将控制权交给调用它的函数进行处理。异常处理的主要任务是力争给用户提供机会,以排除环境错误,继续执行程序或者使程序给出恰当的提示。
异常处理是C++语言的一个重要特征。出错处理机制更加完美,它使
得异常的引发和处理不必在同一函数中。由于在大型软件中,函数之间有着明确的分工和复杂的调用关系,如果在每一处可能出现错误的地方都加入错误处理代码,不仅会使程序显得冗长,可读性不好,而且会产生代码膨胀,影响程序的效率。实际上在很多情况下,发现错误的函数往往不具备处理错误的能力。在C++程序中,针对这种情况可以引发一个异常,希
望它的调用者能够捕获这个异常并处理这个错误。如果调用者也不能处理这个错误,还可以继续传递给上级调用者去处理,这种传播会一直继续到异常被处理为止。如果程序始终没有处理这个异常,最终它会被传到C++
运行系统那里,运行系统捕获异常后通常只是简单地终止这个程序。本章将通过具体的例子讨论异常处理的使用方法。
异常处理的语法如下:
throw 表达式语法
throw 表达式
try 表达式语法
try
受保护的程序段语句
catch(异常类型)
异常处理语句;
catch(异常类型)
异常处理语句;
......
try、throw和catch语句实现异常处理,在程序的某个函数中发现异常时使用throw表达式抛出这个异常,这个异常被抛给该函数的调用者,调用者用catch捕捉该异常并进行相应的处理。当预测到某段程序将可能出现问题时,则将该段程序放在try语句之后,使该段程序得以有机会抛出异常。
异常类型与throw抛出的异常类性相匹配,当某个异常发生后,catch语句将逐个被检查,直到某个异常类型与throw抛出的异常类型相匹配,执行catch后面的异常处理程序。
若catch括号中是省略号,即catch(......),该catch可以捕捉所有的异常类型,语句一般放在所有catch语句的最后一个,否则其他catch语句就没有机会捕捉相应的错误类型了。
【 异常处理的基本语法】
当某个异常被捕捉并被相应的程序段处理后,系统将继续执行捕捉函数的其余部分。产生异常的函数和直到捕捉到异常的函数之间的所有调用链上的函数将从栈中删除。如果一个异常没有被任何函数捕捉到,则运行函数terminate将被调用,该函数的默认功能是调用abort函数终止程序的运行。
void fun()
{
int i;
double f;
char c;
...... //程序的其他部分
try //预期可能出现问题的地方,保护起来
{
//如果出现问题1,抛出一个整数(只是假设)
throw i;
//如果出现问题2,抛出一个双精度数(只是假设)
throw f;
//如果出现问题3,抛出一个字符(只是假设)
throw c;
}
一个异常处理的过程表示:
catch(int ii) { //相应处理}
catch(double ff) { //相应处理}
catch(char cc) { //相应处理}
...... //程序其他部分
}
异常的抛出和捕捉在同一函数中
//源程序开始
//
#include <iostream>
#include <string>
using namespace std;
class Person //声明Person类
{
protected:
char name[30]; //姓名
int age; //年龄
unsigned long ID; //身份证号
char gender; //性别
例 12-2
public:
Person(const char *name_t, const int age_t, const unsigned long id,const char
gender_t); //Person类的构造函数
};
Person::Person(const char *name_t, const int age_t, const unsigned long id,const char gender_t) //Person类的构造函数的实现
{
strcpy(name,name_t);
age=age_t;
ID=id;
gender=gender_t;
if(strlen(name)==0) throw "Invalid Person's name!";//有效性检查
if((age<0)||(age>200)) throw age; //有效性检查
if((gender!='M')&&(gender!='m')&&(gender!='F')&&(gender!='f'))
throw gender; //有效性检查
}
void fun() //捕获并处理Person类构造函数中抛出的异常
{
try
{
cout<<″fun line1″<<endl;
Person p1(″zhang″,10,12345566L,′M′); //类Person的对象p1
(续)
cout<<″fun line2″<<endl;
Person p2(″wang″,-1,22222222L,′F′); //类Person的对象p2
cout<<″fun line3″<<endl;
Person p3(″″,-1,33333333L,′M′); //类Person的对象p3
cout<<″fun line4″<<endl;
Person p4(″″,-1,44444444L,′F′); //类Person的对象p4
}
catch(char) //捕捉错误并进行处理
{
cout<<″Invalid gender!″<<endl;
}
catch(int) //捕捉错误并进行处理
{
cout<<″Invalid age!″<<endl;
}
catch(char * Msg) //捕捉错误并进行处理
{
cout<<″Invalid Name: ″<<Msg<<endl;
}
}
(续)
int main()
{
cout<<″before fun...″<<endl;
fun();
cout<<″end fun...″<<endl;
cout<<″in the main function!″<<endl;
return 0;
}
异常的引发和处理一般在不同函数中,底层函数可以专注于具体问题,上层调用函数可以在恰当的位置设计对不同类型的异常进行各种处理而不考虑底层函数是如何产生这个异常的。
演示异常处理的搜索层次
//源程序开始
//
#include <iostream>
#include <string>
using namespace std;
例 12-3
class Person //声明类Person
{
protected:
char name[30]; //姓名
int age; //年龄
unsigned long ID; //身份证号
char gender; //性别
public:
Person(const char *name_t, const int age_t, const unsigned long id,const char
gender_t); //Person类的构造函数
};
Person::Person(const char *name_t, const int age_t, const unsigned long id,const char
gender_t) //Person类的构造函数的实现
{
strcpy(name,name_t);
age=age_t;
ID=id;
gender=gender_t;
if(strlen(name)==0) throw "Invalid Person's name!"; //有效性检查
if((age<0)||(age>200)) throw age; //有效性检查
if((gender!='M')&&(gender!='m')&&(gender!='F')&&(gender!='f'))
throw gender; //有效性检查
}
(续)
void fun() //本函数内没有异常捕获和处理模块
{
cout<<″fun line1″<<endl;
Person p1(″zhang″,10,12345566L,′M′); //类Person的对象p1
cout<<″fun line2″<<endl;
Person p2(″wang″,-1,22222222L,′F′); //类Person的对象p2
cout<<″fun line3″<<endl;
Person p3(″″,-1,33333333L,′M′); //类Person的对象p3
cout<<″fun line4″<<endl;
Person p4(″″,-1,44444444L,′F′); //类Person的对象p4
}
int main() //主函数内有异常的捕获和处理模块
{
try
{
cout<<″before fun...″<<endl;
fun();
cout<<″end fun...″<<endl;
}
(续)
catch(char) //捕捉错误并进行处理
{
cout<<″Invalid gender!″<<endl;
}
catch(int) //捕捉错误并进行处理
{
cout<<″Invalid age!″<<endl;
}
catch(char * Msg) //捕捉错误并进行处理
{
cout<<″Invalid Name: ″<<Msg<<endl;
}
cout<<endl;
cout<<″in the main function!″<<endl;
return 0;
}
//源程序结束
(续)