C++的异常处理 & Objc的异常处理

C++异常用try、throw、catch三个关键字处理,基本的思路就是用try来捕捉异常、用throw抛出异常、用catch捕获异常并处理。

基本格式如下:

try {

        if (subscript <0 || subscript >9) {

            throw subscript;

        } else {

            cout <<"数组对应的元素:"<< arr[subscript]<<endl;

        }

    } catch (int) {

        cout <<"数组下标越界!\n";

    }


为了更加明显的指使出错误,可以使用多个catch语句:

try {

        if (subscript <0 || subscript >9) {

            throw subscript;

        } else {

            cout <<"数组对应的元素:"<< arr[subscript]<<endl;

        }

    } catch (int) {

        cout <<"数组下标越界!\n";

    } catch (char *) {

        

    } catch (...) {

        

    }

需要注意的是:
1、至少有一个catch语句,否则编译不通过;
2、如果使用多个catch语句、每个catch所能捕获的异常必须是不同类型,一旦某个catch语句被执行、其余的catch语句都不会被执行;
3、catch(...)能处理所有的异常、它必须是最后一条语句,否则编译不通过;

捕获函数内部抛出的异常:

void returnElement(int subscript,int arr[]) {

    if (subscript <0 || subscript >9) {

        throw subscript;

    } else {

        cout <<"数组对应的元素:"<< arr[subscript]<<endl;

    }

}

int main(int argc,constchar * argv[]) {

    int subscript;

    int arr[10] = {0,1,2,3,4,5,6,7,8,9};

    cout <<"请输入下标:";

    cin  >> subscript;

    try {

        returnElement(subscript, arr);

    } catch (int) {

        cout <<"数组下标越界!\n";

    }

    

    return0;

}

像这样try捕获函数中的异常,由在函数体中的throw语句将异常抛出。


上述的catch(...)已经能确保程序不会异常结束,若我们没有使用catch(...)而且catch()语句也没有将异常捕获,系统将会调用C++标准库中的函数terminate(),在默认情况下,函数terminate()将调用abort()函数来中止程序。但如果需要,程序员也可以编写自己的中止函数,然后通过set_terminate函数传递给异常处理模块,使系统在找不到匹配的catch()语句时调用该函数、然后我们在该函数中对程序做善后处理:

void returnElement(int subscript,int arr[]) {

    if (subscript <0 || subscript >9) {

        throw subscript;

    } else {

        cout <<"数组对应的元素:"<< arr[subscript]<<endl;

    }

}

void myAbort() {

    cout <<"error!!!\n";

    //释放程序中的系统资源

    exit(1);

}

int main(int argc,constchar * argv[]) {

    int subscript;

    int arr[10] = {0,1,2,3,4,5,6,7,8,9};

    cout <<"请输入下标:";

    cin  >> subscript;

    try {

        set_terminate(myAbort);

        returnElement(subscript, arr);

    } catch (char) {

        cout <<"数组下标越界!\n";

    }

    

    return0;

}

当然如果有catch(...),这个就没必要了。


在程序设计中大多数异常的类型都是类,当然catch()语句可以捕获任意类型的异常,为异常定义一个类来描述发生的错误信息当然是很有用的,实现方法只需实现这个类,其余的和catch(基本类型)是一致的。

c++的标准库中抛出的异常称为标准异常,c++的标准库是经过十余年的发展形成的,有兴趣的可以了解。



下面我们来讨论一次Objc的异常处理(虽然很少用到、但作为一种机制、有其存在的理由):

Objc提供了@try、@catch、@throw、@finally来捕捉异常:

@try

@catch(异常类1 实例)

@catch(异常类2 实例)

...

@finally

{

}

在执行@try块时若出现异常,系统将生成一个异常对象,并由系统抛出异常;

NSException类是所有异常类的父类

如果异常对象为@catch()块中异常类或其子类的实例,则由该@catch()块捕获异常;

可以有多条@catch()语句,目的是提供更细致的异常信息,但只会执行其中的一条,所以@catch()语句应先处理子类异常,再处理父类异常,

@finally负责回收资源,@catch()和@finally()不是必须的,但二者必须有一种,同时出现时,@finally必须位于@catch()之后,,而且总会被执行。

@throw语句是可以单独使用的,当我们自定了一个继承自NSExceotion的类时,我们可以自定义增加一些附加信息,然后直接由@throw抛出。


如同邮电大学的标志(读书顶个球用),这两门语言存在于历史的长河中几十年之久,有着各自的优点与缺点!



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值