java异常实例讲解,异常链的妙用(缓存类为例)

字数 302阅读 572

上节课我们简单的了解一下异常,在我们实际开发中 不太建议直接写Exception的 它是顶级异常类 一般我们要自定义异常 使我们代码可读性更高
java中有很多内置的异常
接下来学习一下自定义异常
我们模拟一个需求
获取缓存
通常有以下做法
1.保存到memecache第三方缓存中
2.保存到文件里
3.保存到数据库中
这节课模拟一下获取数据
传入key
1.如果已经存在缓存了,那么直接返回
2.如果不存在,则看本地文件中是否有key命名的文件
3.如果还没有,就从数据库中获取
创建一个CacheService类文件
里面有一个getCache获取值的方法
因为需要自定义异常 在我们的包下建一个Exceptions文件夹 表示我们的自定义异常 里面可以有很多异常
创建一个CacheNotFoundMem.java文件 代表自定义异常类 表示从memcache中获取不到缓存
项目目录如下


image.png

CacheService代码


image.png

CacheNotFoundMem代码
image.png

接下来创建CacheNotFoundFile文件
代码如下
image.png

创建CacheNotFoundDb文件
代码如下
image.png

cacheService下的代码变为
image.png

这时我们需要修改CacheService里的getCache方法
image.png

这段代码意思为先从缓存中获取数据 获取不到再从文件中获取 文件中取不到从数据库中获取 数据库中取不到 则将异常抛到外部 使调用getCache方法的文件负责 也就是本例子的MyIndex文件的main方法
MyIndex代码如下
image.png

首先将key值传入ab 这时打印结果为
image.png

接下来传入abc 结果为
image.png

因为我们的资源文件夹下面存在这个文件
image.png

接下来传入abcdefg 打印结果为


image.png

接下来随意传入一个值asdad打印结果为
image.png

在写java程序过程中 我们可能见过报出一堆错误 其中有某个异常引起的其他异常 导致程序无法运行
从结果可以看出我们只捕获到了最后一个异常信息 前面过程中异常信息我们没有捕获到
这时就需要了解一下异常链 我们希望将异常进行链式组合并传递 最终如果发生异常 可以将之前发生过异常的全部收集出来
接下来需要改造一下代码
我们将CacheService里面的代码改造一下
首先将之前的第一种代码注释掉
第二种代码 异常链使用
image.png

注意这里抛出异常的使用 是将上一个异常的实例传到第二个参数里面了
同时对应改造CacheNotFoundFile和CacheNotFoundDb中的构造函数 新增一个支持两个参数的构造函数(第一个参数message,第二个参数自定义的异常类) 这些构造函数全为Exception异常类中带有的 并不是我们瞎编的
Db代码如下
image.png

File代码如下
image.png

接下来修改一下getCache方法
image.png

这里有个技巧 是直接调用getFromDb 不需要执行getFromMem和getFromFile
接下来测试一下MyIndex里面的代码和运行内容
key传入ab
image.png

运行结果
image.png

key传入abc
image.png

运行结果
image.png

key传入abcdefg
image.png

运行结果
image.png

key值随便传入abcd
image.png

运行结果
image.png

可以看出最终结果是db中没有值 但是过程中的异常全部捕获到了 显示memecache中没有再到文件中没有再到数据库中没有值

推荐阅读更多精彩内容