不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2019-01-01 23:38  分类:Java  编辑

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

Java中有很多内置的异常

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

我们模拟一个需求

获取缓存

通常有以下做法

  • 1.保存到memecache第三方缓存中
  • 2.保存到文件里
  • 3.保存到数据库中

这节课模拟一下获取数据

传入key

  • 1.如果已经存在缓存了,那么直接返回
  • 2.如果不存在,则看本地文件中是否有key命名的文件
  • 3.如果还没有,就从数据库中获取

创建一个CacheService类文件

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

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

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

项目目录如下

CacheService代码

 CacheNotFoundMem代码

接下来创建CacheNotFoundFile文件

代码如下

创建CacheNotFoundDb文件

代码如下

cacheService下的代码变为

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

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

MyIndex代码如下

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

接下来传入abc 结果为

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

接下来传入abcdefg 打印结果为

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

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

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

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

接下来需要改造一下代码

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

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

第二种代码 异常链使用

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

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

Db代码如下

File代码如下

接下来修改一下getCache方法

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

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

key传入ab

运行结果

key传入abc

运行结果

key传入abcdefg

运行结果

key值随便传入abcd

运行结果

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

 

 

参考:https://www.jianshu.com/p/cf9e29635435