您的位置:首页 > 编程语言 > C语言/C++

C++的异常处理

2013-07-20 12:08 155 查看
程序中常见的错误有两种:语法错误和运行时错误

语法错误一般在编译的时候会给出提示,但是运行时错误则不是那么容易发现的。有的甚至能正常运行,但是不能给出正确的结果,或者程序非正常终止,或者导致死机。

因此,所有导致出现这些非正常情况的都属于异常。在程序中我们要自己给出相应的异常处理机制,来避免出现自己未预料到的结果。

C++给出的异常处理机制由三部分组成:检查(try)、抛出(throw)、捕捉(catch)。

把需要检查的语句放在try块中,throw用来在出现异常的时候发出一个异常信息,catch用来捕捉这个信息,如果捕捉到了,就处理它。

语法:

throw 语句一般是由throw运算符和一个数据组成的,形式为 throw 表达式

try-catch结构为

try

{

要检查的语句块;

}

catch (异常信息类型 [变量名])

{

处理异常的语句;

}

说明:

(1)被检查语句必须放在try语句块中,否则不起作用

(2)try和catch必须放在一起,中间不能隔其他的语句。也可以只有try,没有catch,表示只检查异常,并不做处理。

(3)try和catch的语句块必须用花括号括起来,即使只有一个语句也不能省略。

(4)一个try-catch结构中,可以只有一个try,但可以有很多catch块,来匹配不同的异常类型。

(5)catch后面的小括号中,一般只写异常信息的类型名,如catch(double)。catch只检查异常信息的类型,而不检查他们的值。

因此,如果要捕捉不同的异常类型,应当由throw抛出不同的异常类型。另外,catch后面的小括号里也可以指定变量名,这样

在throw抛出异常时若指定了变量,可以由catch指定的变量来获取异常变量的拷贝。以便于后面对该异常信息的需要。

(6)若catch后面的小括号中没有类型名,只有...。即catch(...),表示可以捕捉到任何类型的异常。这种catch子句应该放在try-catch结构的

最后,表示捕捉到异常的其他情况。否则,其他的catch将不起作用。

(7)try-catch结构可以出现在同一个函数中,也可以不出现在同一个函数中。在异常出现的时候,系统会自动先在本函数中寻找匹配的catch,

如果找不到匹配的,则会去距离该try最近的catch寻找匹配,直到找到匹配的catch结构。

(8)在有些情况下,throw可以不包括任何表达式,表示我不处理这个异常,交给上级函数去处理。

(9)如果throw抛出的异常找不到匹配的catch子句去处理,则系统会调用一个系统函数terminate,使程序终止运行。

例子

#include <iostream>

using namespace std;

intmain( )

{void f1( );

try

{f1( );}//调用f1( )

catch(double)

{cout<<″OK0!″<<endl;}

cout<<″end0″<<endl;

return 0;

}

void f1( )

{void f2( );

try

{f2( );} // 调用f2( )

catch(char)

{cout<<″OK1!″;}

cout<<″end1″<<endl;

}

void f2( )

{void f3( );

try

{f3( );} // 调用f3( )

catch(int)

{cout<<″Ok2!″<<endl;}

cout<<″end2″<<endl;

}

void f3( )

{double a=0;

try

{throw a;} //抛出double类型异常信息

catch(float)

{cout<<″OK3!″<<endl;}

cout<<″end3″<<endl;

}

程序运行结果如下:

OK0!(在主函数中捕获异常)

end0 (执行主函数中最后一个语句时的输出)

如果将f3函数中的catch子句改为

catch(double),而程序中其他部分不变,则程序运

行结果如下:

OK3!(在f3函数中捕获异常)

end3 (执行f3函数中最后一个语句时的输出)

end2 (执行f2函数中最后一个语句时的输出)

end1 (执行f1函数中最后一个语句时的输出)

end0 (执行主函数中最后一个语句时的输出)

如果在此基础上再将f3函数中的catch块改为

catch(double)

{cout<<″OK3!″<<endl;throw;}

程序运行结果如下:

OK3!(在f3函数中捕获异常)

OK0! (在主函数中捕获异常)

end0 (执行主函数中最后一个语句时的输出)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: