[音乐]
下面这一讲我们谈一下这个异常处理
我们知道在计算机运行的时候总会出现各种各样的 意想不到的这样的情况,或者说会出错
那么有些错误并不是程序这样的一个编写所造成的。
那譬如讲在进行除法运算的时候除数为零了 或者当我们正想往优盘上写入一个文件的时候
优盘被拔掉了,那么这时候写入文件就会出错。
那么这时候就产生的事情叫做异常的处理 那么发生了异常这是经常的会有的事情,甚至是难以避免的事情
那么现在的问题就是如果发生了异常,那么我们该怎么办? 那么最简单的就是我们什么都不办
那么当发生一个异常的时候,那么这样的异常就会为操作系统所捕获 它就会监测到这样的一个程序出现了问题
你于是就简单粗暴的让这个程序怎么样呢?终止运行,然后就完事儿了
那么如果这样处理的话,显然那么对于这样的一个,客户的这样的一个 或者说程序使用用户的这样一个体验会非常的不好
那么大多数情况下我们应该是能够 发现这样的一个异常,我们称之为捕获这样的一个异常。
那么 友善的提示在这边出现了错误,请这样的一个用户更正错误了之后 让程序得以这样的一个继续。
那么如果有这样的一个机制,就是我们在程序里面用到的 异常处理。
下面我们来看一个简单的例子 那么这是一个简单的
一个程序的例子,在这个程序里面一共只有四行代码 其中前两行代码从键盘输入了
a 跟 b,然后在第四行代码里面 让 a/b,最后我们输出了这样的一个除的结果
那么一般情况下,一般情况下,那么我们输了一个 a,输了一个
b 然后得到一个 a 跟 b 相除的结果,这并没有什么问题
那么在这个幻灯片的这个下方我们会看到一个程序运行的结果的截屏 那么也就是说当我们输入了这样的一个
5,输入了一个 4 了之后呢,那么结果是 1,5 除 4 的这样的一个商是 1 没有问题。
那么如果,如果我们不小心在第二 个 b 里面输入的是一个
0,会产生一个什么样的现象呢? 这是程序运行的时候产生的这样的一个景象 我们输入了一个
3,并且输入了一个 0 那么立刻就会在屏幕上看到了这样的一个"未经处理的异常"
尝试什么什么除以 0,然后随后怎么样呢?随后
在这样的一个操作系统下面弹出了这样的一个对话框 我们这样的一个
CSHARP console application 这样的一个程序怎么样呢?
已停止工作,出现了一个问题导致程序停止正常工作 如果有可能的解决方案,Windows
将关闭程序并通知你 这时操作系统怎么样呢?发现这个程序出现了异常,但是并没有什么人来处理这个异常
因此怎么样呢?简单的通知了这样的一个使用的用户,Windows 操作系统怎么样呢?将 关闭程序。
当然了,是否精确的会出现这样的一个对话框? 那么肯定会出现这样的一个关闭程序的对话框。
是不是会出现一个像我这个屏幕上展示的这个样式的对话框? 那么根据不同的 Windows 的这样的一个系统是有所不同的。
那么在 XP,还有在 win 7,还有在这样的一个 Vista 底下都是有,稍略有不同的这样的一个 对话框。
这个对话框显示的是 Windows 10 底下出现的这样的一个对话框 那么不但是除以
0 会出现这样的一个异常,那么如果现在 回到我们这个程序,我们来看一下。
那么在我们的程序里面,我期望呢是用户从键盘输入两个整数 其中一个是 a,一个是 b。
那么如果用户在输入整数的时候,譬如讲输入了一个字符或者一个字符串 输入了一个什么
abc,或者输了一个什么 之类的这样一个字符东西。
那么怎么回事呢?同样的也会出现这样的一个 异常。
那么这样的一个异常如果我们没有特别地去处理的话 那么这样的一个异常就会立刻提交到这样的一个操作系统这样的一个层面上
那么操作系统对这样的一个异常的处理,那么就是简单的怎么样呢?
把这个程序终止掉,那么让这个程序直接怎么样呢?停止这样的一个运行就完了
但是我们前面已经讲过了,那么这样的一个处理怎么样呢?显然显得有些不够友好
譬如讲当我们该输入一个整数的时候,我们不小心输成了一个字符或者一个字符串
当我们进行两个数相除的时候,不小心把这两个一个 被除数输成了 0。
那么这样子犯了这样子的错误了之后 比较友好的一个处理的方式应该是什么呢?
应该是提示用户这样的一个输入不对 或者这样的一个,或者这样一个给的数的大小或者不对,等等
那么使得怎么样呢?让提示用户再一次地尝试怎么样呢?新的这样的输入 那么有了新的输入了之后,让程序得以什么样呢?继续
那么要使得这样的一个事情能够得以 这样的一个实现,那么我们就得用到这样
CSHARP 里面提供的这样的 异常处理机制。
那么通常我们在 CSHARP
里面提供了这样的一些关键字和这样的一些格式来处理这样的一个异常 首先是一个关键字 try。
那么在这样的一个 try 的 关键字里面,它会有一个大括号怎么样呢?括起来的这样的一段代码
在 try 的后面怎么样呢?可以有一个 catch,在 catch 后面怎么样呢?还可以有一个
finally 那么这样的几个关键字组成了一段异常处理程序的代码
那么这一段代码是怎么用的呢?是这样用的:当我们 需要把有可能产生的异常的代码放到一个
try 的块里面来 放到一个 try 的块里面来,那么也就是说尝试着运行一下这样的一些代码
当这些代码真的出现了异常的时候 那么会逐个匹配
catch 后面怎么样呢? 的捕获的异常。
如果 catch 后面没有跟 任何参数的话,那就意味着这个
catch 捕获一切异常 也就是说如果你把一段代码放到了一个 try
的里面,后面跟着有一个 catch 的话 那么当这段代码出现了异常的时候,这个异常
不会立刻提交到 Windows 操作系统里面去 而是会立刻转向
catch 里面要出现 就要这样的一个 catch 里面的代码。
譬如讲我们可以在什么呢?在 catch 里面
分析一下出错的原因,对不对?然后怎么样呢?重新把程序转到什么呢? 转到
try 的地方,让用户怎么样呢?再一次的进行尝试 这就是最简单的
try 跟 catch 组成的这样的一段 捕获异常的代码。
那么还有一个可选的这样的一个关键字,finally finally
的意思是不管这个异常是否出现,或者 出,或者被处理,那么
finally 总是要被执行的代码 那么也就是说在出现异常的时候怎么样呢?不管你的程序是退出了还是继续了
还是怎么样了,如果 catch 都没有捕获到这些异常的话
那么最终当把这个异常返回到这样的一个操作系统 层面之前,finally
里面的代码怎么样?总归会被执行 也就是说当异常发生了之后,如果你有一些事情,譬如讲要释放内存
要干一些什么什么必须的事情的话,可以把这样的一个代码怎么样呢?放到 finally 这样的一个块里面。
finally 不是必须的,它是一个可选的 但是如果你在一个代码里面使用了
try 这个块,就必须要有 catch 所以说 try 跟
catch 必须是一起出现的 不能光有 try 没有 catch。
但是怎么样呢? finally 这个代码怎么样呢?是可以 可选出现的。
那么在一个 try 后面怎么样呢?可以有多个 catch 可以有多个 catch。
也就是说什么呢?也就是说这个 catch 可以捕获 多个异常,并且在
catch 后面怎么样呢?还可以 有一些这样的一个捕获不同类型的异常。
也就是说 catch 后面可以带来一个 参数,这个参数通常是我们
exception 类的怎么样呢? 的一个类,或者对象,或者 exception
类的一个 派生类的对象,来捕获这样不同类型的参数
譬如讲我可以专门捕获什么呢?捕获除数是否是为 0 的这样的一个 catch 这样的异常。
我专门捕获什么呢?我专门捕获 这样的一个输入格式是否正确的这样的一个异常
那么这样的一个异常捕获到了之后,我可以更有针对性的怎么样呢?来处理这些异常。
如果 catch 后面没有带有任何参数的话,那么它通常是捕获出现的所有的异常 捕获出现所有的异常。
那么当然这样子它可以把所有的异常 捕获掉,但是到底出了异常我们还得进一步的去判断
才能够写出相应的这样的一个处理异常的 代码。
在一个 try 后面可以跟有多个 catch 的块,以便捕获不同的 异常。
那么捕获了这样的一个发生的异常的时候,会按照这样的一个 catch
出现的顺序 依次匹配每一个异常是否能够得以匹配
如果有匹配的异常的话,那么就会转入到 相应的
catch 块里面的语句,进行执行你写的这些代码
那么如果没有,所有的异常都没有得到匹配的话,就会看有没有 finally 块。
如果有 finally 的话就会执行 finally
块里面的代码 如果还是没有的话,那么就,这个异常就会向上提交给到操作系统了
那么这个就是一个我们处理异常的这样的一个大致的步骤