C++异常处理建立在三个关键字基础之上:try、catch和throw。通常,监测异常情况的程序语句包含在try中。如果try块中发生了异常(也就是错误),则用throw处理。异常由catch捕获,并得到处理如前所述,抛出异常的语句必须在try块中执行(在try块中调用的函数也可能抛出异常)。任何异常必须由紧跟在抛出异常的try语句之后的catch语句捕获。try和catch的一般
形式如下:
try{
// try block
}
catch(type1 arg){
//catch block
}
catch (type2 arg){
// catch block
}
catch(type3 arg){
// catch block
}
catch(typeN arg) {
// catch block
}
try块必须包括用户程序中监测错误的部分。它们可以短至函数中的几条语句,也可以是象try块(有效地监测整个程序)中main()函数的代码那样完全包装。异常发生时,由相应的catch语句去捕获并处理此异常。与一个try相关的catch语句可能不止一条。至于使用哪条catch语句,则由异常的类型决定。也就是说,如果由catch语句说明的数据类型与异常情况匹配,则此catch语句(其它catch语句跳过)执行。当捕获一个异常时,arg将接受它的值。可以捕获任何类型的数据,包括用户创建的类。如果try块中无异常(错误)发生,则不执行任何catch语句。
throw语句的一般形式如下:
throw exception;
throw必须在try块中或在try块中任何直接或间接调用的函数中执行。exception是被抛出的一个值。
如果对于抛出的异常没有合适的catch语句,则会发生程序异常终止。如果用户的编译程序符合建议的ANSI C++标准,那么抛出一个未被处理的异常会引起调用terminate()函数。缺省时,terminate()调用abort()终止用户程序,但如果用户愿意,则可以定义自己的终止处理程序。请参阅自己的编译程序库函数参考手册以了解详情。
下面的程序显示了C++异常处理操作的方法:
void func(float a,float b,float c){
if(b==0)
{
throw "Divided by zero";
}
c=a/b;
}
void func1(){
}
void func2(){
}
int main(int argc, char *argv[])
{
float a=10;
float b=0;
float c=0;
try{
func(a,b,c);
func1();
func2();
}catch(const char* str){
cout<<str<<endl;
}
return 0;
}
try块中包含了三条语句和一个处理整型异常的catch(char *str)语句。在try块中,三条语句仅有两条会执行:第一条cout语句和throw语句。一旦有异常被抛出时,控制权转向catch语句,try块则被终止。也就是说,catch没有被调用,而只是将程序执行权转给它(程序栈在需要时自动复位)。因此,throw后的cout语句不会执行。
通常,catch语句中的代码试图通过适当的操作纠正错误。如果错误能够排除,catch语句后的程序继续执行。但通常有错误不能排除,则catch块将调用exit()或abort()以终止程序。
如上所述,异常的类型必须与catch语句说明的类型匹配
形式如下:
try{
// try block
}
catch(type1 arg){
//catch block
}
catch (type2 arg){
// catch block
}
catch(type3 arg){
// catch block
}
catch(typeN arg) {
// catch block
}
try块必须包括用户程序中监测错误的部分。它们可以短至函数中的几条语句,也可以是象try块(有效地监测整个程序)中main()函数的代码那样完全包装。异常发生时,由相应的catch语句去捕获并处理此异常。与一个try相关的catch语句可能不止一条。至于使用哪条catch语句,则由异常的类型决定。也就是说,如果由catch语句说明的数据类型与异常情况匹配,则此catch语句(其它catch语句跳过)执行。当捕获一个异常时,arg将接受它的值。可以捕获任何类型的数据,包括用户创建的类。如果try块中无异常(错误)发生,则不执行任何catch语句。
throw语句的一般形式如下:
throw exception;
throw必须在try块中或在try块中任何直接或间接调用的函数中执行。exception是被抛出的一个值。
如果对于抛出的异常没有合适的catch语句,则会发生程序异常终止。如果用户的编译程序符合建议的ANSI C++标准,那么抛出一个未被处理的异常会引起调用terminate()函数。缺省时,terminate()调用abort()终止用户程序,但如果用户愿意,则可以定义自己的终止处理程序。请参阅自己的编译程序库函数参考手册以了解详情。
下面的程序显示了C++异常处理操作的方法:
void func(float a,float b,float c){
if(b==0)
{
throw "Divided by zero";
}
c=a/b;
}
void func1(){
}
void func2(){
}
int main(int argc, char *argv[])
{
float a=10;
float b=0;
float c=0;
try{
func(a,b,c);
func1();
func2();
}catch(const char* str){
cout<<str<<endl;
}
return 0;
}
try块中包含了三条语句和一个处理整型异常的catch(char *str)语句。在try块中,三条语句仅有两条会执行:第一条cout语句和throw语句。一旦有异常被抛出时,控制权转向catch语句,try块则被终止。也就是说,catch没有被调用,而只是将程序执行权转给它(程序栈在需要时自动复位)。因此,throw后的cout语句不会执行。
通常,catch语句中的代码试图通过适当的操作纠正错误。如果错误能够排除,catch语句后的程序继续执行。但通常有错误不能排除,则catch块将调用exit()或abort()以终止程序。
如上所述,异常的类型必须与catch语句说明的类型匹配