初探C++异常处理学习笔记

异常处理

 

异常处理基础

 

用try、catch处理异常

 

#include <iostream>
using namespace std;
int main() 
{
    double m ,n;
    cin >> m >> n;
    try {
        cout << "before dividing." << endl;
        if( n == 0)
            throw -1; //抛出整型异常
        else if( m == 0 )
            throw -1.0; //抛出double型异常
        else
            cout << m / n << endl;
           cout << "after dividing." << endl;
}
    catch(double d) {
        cout << "catch(double) " << d << endl;
}
    catch(...) {
        cout << "catch(...) " << endl;
}
    cout << "finished" << endl;
    return 0;
}



 

说明

1.在可能发生异常的地方,添加一个try块,并且加入throw语句,在异常发生时抛出异常。

2.若不发生异常,则跳过后续的catch语句,正常执行。

3.若发生异常则立即停止try块的语句,搜寻catch语句并匹配该异常对应的处理语句。

4.若找不到对应的catch处理语句则可能使程序崩溃。

5.catch(...)可能匹配任何异常。

6.异常的匹配是从上到下开始的。

 

程序运行结果:

<1>

9  0

before dividing

catch(...)

finished

 

<2>

0  6

before dividing

catch (double) -1

finished

 

 

注:

如果一个函数在执行的过程中,抛出的异常在本函数内就被catch块捕获并处理了,那么该异常就不会抛给这个

函数的调用者(也称“上一层的函数”);如果异常在本函数中没被处理,就会被抛给上一层的函数。

 

 

 

 

标准异常类

 

常见的几种异常

 

 

 

 

 

bad_cast

 

在用 dynamic_cast进行从多态基类对象(或引用),到派生类的引用的强制类型转换时,如果转换是不安全的,则会

抛出此异常。

见此博客最后一点初探C++强制类型转换

 

try {
    Derived & rd = dynamic_cast<Derived&>(b);
    //此转换若不安全,会抛出bad_cast异常
    rd.Print();
}
catch (bad_cast& e) {
    cerr << e.what() << endl;
}


 

bad_alloc


在用new运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常。

 

try {
    char * p = new char[0x7fffffff]; //无法分配这么多空间,会抛出异常
}
    catch (bad_alloc & e) { 
        cerr << e.what() << endl;
}


 

out_of_range


用vector或string的at成员函数根据下标访问元素时,如果下标越界,就会抛出此异常。

 

vector<int> v(10);
try {
    v.at(100)=100;  //抛出out_of_range异常
}
catch (out_of_range& e) {
    cerr << e.what() << endl;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值