关闭

C++异常处理

743人阅读 评论(0) 收藏 举报
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语句说明的类型匹配
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:219277次
    • 积分:3550
    • 等级:
    • 排名:第9650名
    • 原创:131篇
    • 转载:20篇
    • 译文:1篇
    • 评论:41条
    文章分类
    最新评论