打开网易新闻 查看更多视频

异常处理 :

C++异常处理基础:try、throw、catch

异常声明(exception specification)

意外异常(unexpected exception)

异常处理的作用

动态内存管理的异常处理

new

程序运行中总难免发生错误 数组元素的下标超界、访问NULL指针 除数为0 动态内存分配new需要的存储空间太大 …… 引起这些异常情况的原因: 代码质量不高,存在BUG 输入数据不符合要求 程序的算法设计时考虑不周到 ……. 我们总希望在发生异常情况时 不只是简单地终止程序运行 能够反馈异常情况的信息:哪一段代码发生的、什么异常 能够对程序运行中已发生的事情做些处理:取消对输入文件 的改动、释放已经申请的系统资源

通常的做法是:在预计会发生异常的地方,加入相应的代码, 但这种做法并不总是适用的 ……//对文件A进行了相关的操作 fun(arg, ……);//可能发生异常 …… caller该如何知道fun(arg, ……)是否发生异常 没有发生异常,可以继续执行 发生异常,应该在结束程序运行前还原对文件A的操作 fun(arg, ……)是别人已经开发好的代码 fun(arg, ……)的编写者不知道其他人会如何使用这个函数 fun(arg, ……)会出现在表达式中,通过返回值的方式区分是 否发生异常 不符合编写程序的习惯 可能发生多种异常,通过返回值判断也很麻烦 需要一种手段 把异常与函数的接口分开,并且能够区分不同的异常 在函数体外捕获所发生的异常,并提供更多的异常信息

用try 、catch处理异常:

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

//捕获任何异常的catch 块:

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

异常的再抛出 如果一个函数在执行的过程中,抛出的异常在本函数内就被catch 块捕获并处理了,那么该异常就不会抛给这个函数的调用者(也 称“上一层的函数”);如果异常在本函数中没被处理,就会被 抛给上一层的函数。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

C++标准异常类:

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

In-Video Quiz:下面哪种说法是正确的?

A)一个函数抛出异常后,必须在函数内部处理该异常,否则程序就会中止

B)只要写了catch块,那么在try块中抛出的异常,一定会被某个catch块捕获并处理

C)程序中抛出的异常如果没有被任何catch块处理,则会导致程序中止

D)try块中抛出异常后,如果该异常被catch块捕获并处理,处理后就会继续执行try 块中的语句。