C++的异常处理

程序中常见的错误有两种:语法错误和运行时错误

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

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


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 (执行主函数中最后一个语句时的输出)


发布了28 篇原创文章 · 获赞 6 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章