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

来源:互联网 发布:淘宝售假违规扣2分 编辑:程序博客网 时间:2024/06/07 05:12

异常处理

 

异常处理基础

 

用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;}


 

 

0 0
原创粉丝点击