java 获取数据源失败_Java 抛出异常 之 异常链(以缓存类为例)

在我们实际开发中,不太建议直接写Exception的,它是顶级异常类,一般我们要自定义异常,使我们代码可读性更高

Java中有很多内置的异常

接下来学习一下自定义异常

我们模拟一个需求

获取缓存

通常有以下做法

1.保存到memecache第三方缓存中

2.保存到文件里

3.保存到数据库中

这节课模拟一下获取数据

传入key

1.如果已经存在缓存了,那么直接返回

2.如果不存在,则看本地文件中是否有key命名的文件

3.如果还没有,就从数据库中获取

创建一个CacheService类文件

里面有一个getCache获取值的方法

因为需要自定义异常 在我们的包下建一个Exceptions文件夹 表示我们的自定义异常 里面可以有很多异常

创建一个CacheNotFoundMem.java文件 代表自定义异常类 表示从memcache中获取不到缓存

项目目录如下

ecacecb815c1751af79315c5d9415025.png

CacheService代码

1c8677b874c4d63866796dafa99ca680.png

CacheNotFoundMem代码

bd20fa17a3361cb0930a756ef9083bac.png

接下来创建CacheNotFoundFile文件

代码如下

458d4463c7c2c8db9d3e0478e96cfde1.png

创建CacheNotFoundDb文件

代码如下

b87b18146b7cb6d156e7cfe9dd4476cf.png

cacheService下的代码变为

83ffca97e43059bd23eaca1389a8ce09.png

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

8d422eb77e21c2d7e79fb7d98e7c645b.png

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

MyIndex代码如下

19940e889dff1e3e74edf38bd9eb6ca4.png

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

c5ea9d13d6e897e82cf0ad9b99fd0929.png

接下来传入abc 结果为

41ca1931e019352d15723d3567b563d8.png

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

9654e2ee7bbc99450d37e0b5ad1ac9c5.png

接下来传入abcdefg 打印结果为

009bc178b891feac0fd548244869410d.png

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

daf9e351171f518548db60168f1168af.png

在写java程序过程中  我们可能见过报出一堆错误 其中有某个异常引起的其他异常 导致程序无法运行

从结果可以看出我们只捕获到了最后一个异常信息 前面过程中异常信息我们没有捕获到

这时就需要了解一下异常链 我们希望将异常进行链式组合并传递 最终如果发生异常  可以将之前发生过异常的全部收集出来

接下来需要改造一下代码

我们将CacheService里面的代码改造一下

首先将之前的第一种代码注释掉

第二种代码 异常链使用

35844936403f9ccbc10856c9020b5653.png

注意这里抛出异常的使用 是将上一个异常的实例传到第二个参数里面了

同时对应改造CacheNotFoundFile和CacheNotFoundDb中的构造函数 新增一个支持两个参数的构造函数(第一个参数message,第二个参数自定义的异常类) 这些构造函数全为Exception异常类中带有的  并不是我们瞎编的

Db代码如下

11cdd1f7ad5c23ce58284222b6b8da6d.png

File代码如下

96ebed7387960dea13e56c36a728b3b9.png

接下来修改一下getCache方法

495fdc3d7ce372c32ba40ec0a08ba33d.png

这里有个技巧 是直接调用getFromDb 不需要执行getFromMem和getFromFile

接下来测试一下MyIndex里面的代码和运行内容

key传入ab

732a4ddd622dc6f5f3564182318609df.png

运行结果

6b933c7dba555e938eb3c016cdc0b611.png

key传入abc

c676389c302cef53ceb15889f45ebc0d.png

运行结果

3201847fdb57825b3a07ec538d11c3e8.png

key传入abcdefg

75bee0adccf58ff99cc3a907f233ed6b.png

运行结果

1547b34def20fcfbced0dcc9d399a170.png

key值随便传入abcd

bbd89ed9fe3483a4e777586b48475559.png

运行结果

70c4e73c94975671d427cf42af2cd17f.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值