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

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


java异常实例讲解,异常链的妙用(缓存类为例)_第1张图片
image.png

CacheService代码


java异常实例讲解,异常链的妙用(缓存类为例)_第2张图片
image.png

CacheNotFoundMem代码
java异常实例讲解,异常链的妙用(缓存类为例)_第3张图片
image.png

接下来创建CacheNotFoundFile文件
代码如下
java异常实例讲解,异常链的妙用(缓存类为例)_第4张图片
image.png

创建CacheNotFoundDb文件
代码如下
java异常实例讲解,异常链的妙用(缓存类为例)_第5张图片
image.png

cacheService下的代码变为
java异常实例讲解,异常链的妙用(缓存类为例)_第6张图片
image.png

这时我们需要修改CacheService里的getCache方法
java异常实例讲解,异常链的妙用(缓存类为例)_第7张图片
image.png

这段代码意思为先从缓存中获取数据 获取不到再从文件中获取 文件中取不到从数据库中获取 数据库中取不到 则将异常抛到外部 使调用getCache方法的文件负责 也就是本例子的MyIndex文件的main方法
MyIndex代码如下
java异常实例讲解,异常链的妙用(缓存类为例)_第8张图片
image.png

首先将key值传入ab 这时打印结果为
java异常实例讲解,异常链的妙用(缓存类为例)_第9张图片
image.png

接下来传入abc 结果为
java异常实例讲解,异常链的妙用(缓存类为例)_第10张图片
image.png

因为我们的资源文件夹下面存在这个文件
java异常实例讲解,异常链的妙用(缓存类为例)_第11张图片
image.png

接下来传入abcdefg 打印结果为


java异常实例讲解,异常链的妙用(缓存类为例)_第12张图片
image.png

接下来随意传入一个值asdad打印结果为
java异常实例讲解,异常链的妙用(缓存类为例)_第13张图片
image.png

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

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

File代码如下
java异常实例讲解,异常链的妙用(缓存类为例)_第16张图片
image.png

接下来修改一下getCache方法
java异常实例讲解,异常链的妙用(缓存类为例)_第17张图片
image.png

这里有个技巧 是直接调用getFromDb 不需要执行getFromMem和getFromFile
接下来测试一下MyIndex里面的代码和运行内容
key传入ab
java异常实例讲解,异常链的妙用(缓存类为例)_第18张图片
image.png

运行结果
java异常实例讲解,异常链的妙用(缓存类为例)_第19张图片
image.png

key传入abc
java异常实例讲解,异常链的妙用(缓存类为例)_第20张图片
image.png

运行结果
java异常实例讲解,异常链的妙用(缓存类为例)_第21张图片
image.png

key传入abcdefg
java异常实例讲解,异常链的妙用(缓存类为例)_第22张图片
image.png

运行结果
java异常实例讲解,异常链的妙用(缓存类为例)_第23张图片
image.png

key值随便传入abcd
java异常实例讲解,异常链的妙用(缓存类为例)_第24张图片
image.png

运行结果
java异常实例讲解,异常链的妙用(缓存类为例)_第25张图片
image.png

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

你可能感兴趣的:(java异常实例讲解,异常链的妙用(缓存类为例))