c++异常处理的方法


本文摘自PHP中文网,作者angryTom,侵删。

c++异常处理

程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0;用户输入年龄时输入了一个负数;用 new 运算符动态分配空间时,空间不够导致无法分配;访问数组元素时,下标越界;打开文件读取时,文件不存在等等。

这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。

所谓“处理”,可以是给出错误提示信息,然后让程序沿一条不会出错的路径继续执行;也可能是不得不结束程序,但在结束前做一些必要的工作,如将内存中的数据写入文件、关闭打开的文件、释放动态分配的内存空间等。

C++ 引入了异常处理机制。其基本思想是:函数 A 在执行过程中发现异常时可以不加处理,而只是“??出一个异常”给 A 的调用者,假定为函数 B。

??出异常而不加处理会导致函数 A 立即中止,在这种情况下,函数 B 可以选择捕获 A ??出的异常进行处理,也可以选择置之不理。如果置之不理,这个异常就会被??给 B 的调用者,以此类推。

如果一层层的函数都不处理异常,异常最终会被??给最外层的 main 函数。main 函数应该处理异常。如果main函数也不处理异常,那么程序就会立即异常地中止。

C++异常处理基本语法

C++ 通过 throw 语句和 try...catch 语句实现对异常的处理。throw 语句的语法如下:

1

throw  表达式;

该语句??出一个异常。异常是一个表达式,其值的类型可以是基本类型,也可以是类。

1

2

3

4

5

6

7

8

try...catch 语句的语法如下:

try {

    语句组

}catch(异常类型) {

  异常处理代码

}...catch(异常类型) {

    异常处理代码

}

catch 可以有多个,但至少要有一个。

不妨把 try 和其后{}中的内容称作“try块”,把 catch 和其后{}中的内容称作“catch块”

try...catch 语句的执行过程是:执行 try 块中的语句,如果执行的过程中没有异常??出,那么执行完后就执行最后一个 catch 块后面的语句,所有 catch 块中的语句都不会被执行;如果 try 块执行的过程中??出了异常,那么??出异常后立即跳转到第一个“异常类型”和??出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”),执行完后再跳转到最后一个 catch 块后面继续执行。

例如下面的程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#include <iostream>

using namespace std;

int main()

{

    double m ,n;

    cin >> m >> n;

    try {

        cout << "before dividing." << endl;

        if( n == 0)

            throw -1; //抛出int类型异常

        else

            cout << m / n << endl;

        cout << "after dividing." << endl;

    }

    catch(double d) {

        cout << "catch(double) " << d <<  endl;

    }

    catch(int e) {

        cout << "catch(int) " << e << endl;

    }

    cout << "finished" << endl;

    return 0;

}

程序的运行结果如下:

1

2

3

4

5

9 6?L

before dividing.

1.5

after dividing.

finished

说明当 n 不为 0 时,try 块中不会??出异常。因此程序在 try 块正常执行完后,越过所有的 catch 块继续执行,catch 块一个也不会执行。

程序的运行结果也可能如下:

1

2

3

4

9 0?L

before dividing.

catch\(int) -1

finished

当 n 为 0 时,try 块中会??出一个整型异常。??出异常后,try 块立即停止执行。该整型异常会被类型匹配的第一个 catch 块捕获,即进入catch(int e)块执行,该 catch 块执行完毕后,程序继续往后执行,直到正常结束。

如果??出的异常没有被 catch 块捕获,例如,将catch(int e),改为catch(char e),当输入的 n 为 0 时,??出的整型异常就没有 catch 块能捕获,这个异常也就得不到处理,那么程序就会立即中止,try...catch 后面的内容都不会被执行。

以上就是c++异常处理的方法的详细内容!

相关阅读 >>

C++是什么

C++清屏函数是什么

新手程序员应该知道的c语言和C++的区别

C++如何从函数返回数组

浅谈C++生成guid的两种方法

C++11多线程编程基础入门

c#调用C++ 动态链接库dll

关于C++中的引用总结

简单工厂factory

c语言数组怎么输入?

更多相关阅读请进入《C++》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...