浅墨浓香

想要天亮进城,就得天黑赶路。

导航

第10课 C++异常简介

Posted on 2017-03-30 14:04  浅墨浓香  阅读(190)  评论(0编辑  收藏  举报

1. try-catch语句

(1)try语句处理正常代码逻辑

(2)catch语句处理异常情况

(3)try语句中的异常由对应的catch语句处理

(4)C++通过throw语句抛出异常信息

2. C++异常处理分析

(1)throw抛出的异常必须被catch处理

  ①当前函数能够处理异常,程序继续往下执行

  ②当前函数无法处理异常,则函数停止执行并返回

(2)未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。

(3)同一个try语句可以跟上多个catch语句

  ①catch语句可以定义具体处理的异常类型

  ②不同类型的异常由不同的catch语句负责处理

  ③try语句中可以抛出任何类型的异常

  ④catch(…)用于处理所有类型的异常

  ⑤任何异常都只能被捕获(catch)一次

(4)异常处理的匹配规则

 

【编程实验】C++异常处理

//main.cpp

#include <iostream>

using namespace std;

double divide(double a, double b)
{
    const double delta = 0.000000000000001;
    double ret = 0;

    if( !((-delta < b) && ( b < delta))){
        ret = a / b;
    }else{
        throw 0; //产生除0异常
    }

    return ret;
}

//匹配规则(自上而下,严格匹配、不进行类型转换)
void Demo1()
{
    try{
        throw 'c';  //抛出字符型的异常
    }catch(int i){
        cout << "catch(int i)" << endl;
    }catch(double d){
        cout << "catch(double d)" << endl;
    }catch(char c){ //只能被这里的catch捕获
        cout << "catch(char c)" << endl;
    }
}

void Demo2()
{
    throw "Demo2";   //const char*
}
int main()
{
    cout << "main() begin" << endl;

    try{
        double c = divide(1, 0);//产生异常
        cout <<"c = " << c << endl; //无法被执行到!
    }catch(...){
        cout << "Divide by zero..." << endl;
    }

    Demo1();

    try{
        Demo2();
    }catch(char* c){
        cout << "catch(char* c)" << endl;
    }catch(const char* c){
        cout << "catch(const char* c)" << endl;
    }catch(...){
        cout << "catch(...)" << endl;
    }

    cout << "main() end" << endl;
    return 0;
}
/*输出结果
main() begin
Divide by zero...
catch(char c)
catch(const char* c)
main() end
*/

3. 小结

(1)C++中直接支持异常处理的概念

(2)try…catch…是C++中异常处理的专用语句

(3)try语句处理正常代码逻辑,catch语句处理异常情况

(4)同一个try语句可以跟上多个catch语句

(5)异常处理必须严格匹配,不进行任何的类型转换