上篇文章中我们简单了解了C和C++中异常处理的不同方式。显然C++中提供的异常处理的功能给我们的编程带来了很大的方便,让我们从处理错误的复杂逻辑中解脱出来,也让我们的代码更加清晰。从这篇文章开始我们就来具体介绍一下C++中的异常处理。
一、抛出异常
如果在程序代码中出现了一些异常情况, 程序员可以创建一个包含错误信息的对象并把它抛出当前语境,这种方法被称为“抛出异常”。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在上面的代码中,Error是一个普通的类,它的构造函数接受一个char* 类型的变量作为参数。在抛出一个异常时,可以使用任意的类型,但通常应当为抛出的异常创建特定的类。
关键字throw将导致一系列事件发生:
1).创建程序所抛出的对象的一个拷贝;
2).包含throw表达式的函数返回了这个对象,即使该函数原来并未声明为返回这种对象类型,这其实是一种交错返回机制(alternate return mechanism).
3).异常会造成程序返回到某个地方,其实就是返回到异常处理器的代码段;
4).异常发生前创建的局部对象被销毁,这种对局部对象的自动清理通常被称为“栈反弹”。
在实际操作中,程序员可以创建不同类型的对象以便在每种不同的异常情况下抛出。这样就可以将错误信息保存在相应的对象和对象类名中,调用者根据这些信息就可以决定应该如何处理这些异常了。