第十课 C++异常简介

  异常不是错误,异常是程序中可预料到的另一条执行分支,是可预见的。错误是不可预料的。

C++内置了异常处理的语法元素try...catch...,如下:

C++通过throw语句抛出异常信息:

上图中throw 0抛出异常后,程序就立即返回了。return代表正常的返回,throw代表异常的返回值。

C++异常处理分析:

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

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

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

未被处理的异常则顺着函数调用栈向上传播:

异常的示例程序如下:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 double divide(double a, double b)
 6 {
 7     const double delta = 0.000000000000001;
 8     double ret = 0;
 9 
10     if( !((-delta < b) && (b < delta)) ) {
11         ret = a / b;
12     }
13     else {
14         throw 0;   // 产生除 0 异常
15     }
16 
17     return ret;
18 }
19 
20 int main()
21 {
22     cout << "main() begin " << endl;
23 
24     try
25     {
26         divide(1, 0);
27     }
28     catch(...)
29     {
30         cout << "Divided by zero" << endl;
31     }
32 
33     cout << "main() end " << endl;
34     return 0;
35 }

执行结果如下:

26行的异常被28行的catch捕获,处理完这个异常之后,程序继续向下执行,33行成功打印出信息。

更改程序如下:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 double divide(double a, double b)
 6 {
 7     const double delta = 0.000000000000001;
 8     double ret = 0;
 9 
10     if( !((-delta < b) && (b < delta)) ) {
11         ret = a / b;
12     }
13     else {
14         throw 0;   // 产生除 0 异常
15     }
16 
17     return ret;
18 }
19 
20 int main()
21 {
22     cout << "main() begin " << endl;
23 
24     try
25     {
26         int c = divide(1, 0);
27 
28         cout << "c = " << c << endl;
29     }
30     catch(...)
31     {
32         cout << "Divided by zero" << endl;
33     }
34 
35     cout << "main() end " << endl;
36     return 0;
37 }

执行结果如下:

可以看到第28行的打印没有输出。

 如果try中的语句没有发生异常,catch中的语句是不会执行的。

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9498609.html