00:00
好,那接下来呢,我们就来说一下如何去创建一个自定义异常,那么我们的创建自定义异常的目标呢,刚才也讲到了,主要呢,就是使用一个异常或者是较少的异常类,可以补货和显示所有的异常信息,对不对?这样的话呢,我们的异常处理方案呢,就更灵活也更简洁啊,然后呢,我们具体的方案呢,就是创建一个自定义异常类,并且呢,在程序中我们要抛出这个自定义异常对象,然后呢,在统一异常处理中呢,捕货自定义异常对象,所以一共是三个步骤啊,创建异常类,抛出异常对象和补货异常对象,那我们一个步骤一个步骤来做,首先第一个步骤就是创建自定义异常类,那我们呢,在我们的exception这个包下面去创建一个business exception就是我们自己定义的一个异常类的名字。好,那么我们找到上面这个exception,然后我们在这个里面呢,去创建一个business exception啊,然后接下来呢,我们呢,呃,第二个步骤是什么呢?看一下第二步骤呢,叫做抛出自定义异常对象,那么如果想让这个异常是一个异常的话,它至少得是一个exception的子类,对吧?好,那我如何抛除它呢?啊,比如说我随便找一个地方啊,我找一个就是咱们的之前的controller。
01:26
是吧,找一个之前的controller,这个controller里面呢,我们啊,比如说咱们找到一个。Save方法吧。比如说我在这个save方法里面啊,我想就是可能有可能发生异常嘛,所以我就想抛一个异常,一旦发生异常的时候,我可能就要。你有我这个business exception啊。嗯,把他先扭出来,扭完了之后,我我是不是得把它死出去,死肉啊,死出去。好,这种你如果要是肉的话,会有个问题,什么问题呢?因为我们这个business exception呢,它是一个exception类型的这样的一个对象,那所以呢,这东西你溜出来,并且肉出去的话呢,它发现呢,它是一个检查类异常,那检查类异常的话呢,它要求你要么你就继续捕获它,对吧,要么你就继续向上抛出,你这样的话,我们这个异常处理呢,就没有就没有终点了,你要么你就。
02:27
继续获它,要么你就呃,要么你就这个呃这呢,要么你就继续捕获它,对吧,要么你就在这个继续向上抛出,是不是啊,所以呢,我们一般情况下,在系统当中,咱们自定义常类,如果想抛出的时候,它这个业务逻辑没有那么复杂,那我们在这个地方呢,就写runtime叫运行时异常。如果这边是运行式异常的话,大家看我这边一旦抛出异常,它就没有要求了,因为它是一个非检查异常啊,你就随时随地抛就行了,需要用到的时候你就抛,不需要用到你就不抛,也不用非要继续抛或继续补货好,所以呢,我们的自定异常的第一个原则就是什么呀,就必须是一个真呢,就必须是一个运行时力差啊,这个是大家要知道的一个点,然后所以我在这个地方。
03:17
可以给你补充一下,就是必须是运行时异常是吧?好,然后接下来呢,我们就可以在程序当中去抛这个异常了,那怎么抛呢?在这块我们肯定得有点原因才抛,你不能上来就抛异常,这是什么意思,比如说呢,我呢就想检查一下这参数对不对,If。这个里面,然后点啊,叫做get borrow integrate啊,然后点get borrow amount。好,这个get borrow on是个什么东西呢?它是我们的借款额度,假设说我前台用户在传参数的时候,不小心没有传这个借款额度这个参数,或者是忘传这个借款额度参数了,那它的值等于,那那我呢就想抛出这个异常,明白吧,所以这块呢,相当于我们对这个参数做一个校验啊,我就想抛这个异常,但是我抛这异常的时候呢,我也得不能就抛完异常就拉倒了,我这异常里面怎么也得写点内容,对不对啊,比如说你的错误码是什么,错误消息是什么,所以呢,我们可以在我们的这个自定义异常里面呢,定义一些成员啊,比如说我们可以定义private in7个,因为我们的异常呢,也想和我们的。
04:41
这个统一返回结果保持一致嘛,所以那我们的异常对象呢,也要定义我们统一返回结果里面的一些信息,那就是错误码和错误消息message啊这块呢,是错误码。然后这块呢,是错误消息好吧,啊,所以这块呢是两个内容,然后接下来呢,我再给它添加一个get set方法啊,然后我再给它添加一个nova constructor,就是这个nova constructor呢就是无参构造函数啊,我先把它填在这,当然了,如果你不写它的话,实际上它的无参构造函数默认也是有的啊,就是就是这。
05:24
在这呢啊,因为后面呢,其实我还想添加一些有参的构造函数,然后无参的构造函数我还想要它,那这样的话,我们就必须明确的把无参的构造函数写上了,是不是啊,所以这个是嗯,无参构造函数先把它添在这,以以免呢后期添加有参构造函数的时候,无参构造函数就消失不见了,自动,所以呢,为了避免一个问题啊,避免这个让我们的代码更严谨一些,好,然后这块呢,就是我们的自定义异常类了。然后呢,这个自定义异常类呢,里面我们其实有这个有这个有参,刚才我说了还有有参,那有参填什么呢?其实还有好几个有参的方法,那这里面我就不给大家一一的去写了,在咱们这个代码还是第二部分Java代码,这里面有一个business exception。
06:12
我们来看一下,这里面呢,就是把其他的有参的构造函数呢,都写在这了。啊,没有什么特殊的逻辑,就是比较麻烦啊,一个一个写,所以这边我就不写了,我把它直接粘过来,大家来看一下,我们一个一个来读一下吧。第一个有参的构造函数呢,就是通一个消息来创建一个异常对象啊,然后第二个有参的构造函数呢,就是通过一个消息再加上一个错误码来创建一个异常对象,好,第三个有参的构造函数呢,就是根据消息加上错误码,再加上我们的原始的异常对象,就是当时你补货的那个异常对象,因为里面包含一些异常跟踪站的信息,然后我们呢,把它啊也给它封装进来,这样的话呢,我们可以在异常处理的具体的过程当中呢,也把异常跟踪站打印出来,不至于我们在这个地方哈,你抛出新的异常的时候,远可能如果有原有异常对象的话,原有异常跟踪站就消失了,明白吧,但是在这个地方不存在这个问题,因为这个地方并没有原有的异常对象,是我们自己在业务逻辑上认为他错了,所以我们自己抛啊,所以呢,这个呢,是未来我们啊会用到的一个内容啊,然后这个也是一样的,根据一个枚举,根据一个枚举。
07:30
来直接抛一个异常对象,你看上面这个呢,是根据一个错误码和错误消息来抛一个异常对象,那实际上更方便的方式呢,就是我们先把错误码和错误消息呢,先封装到枚举中,然后直接呢根据枚举来抛一场对象就行了,然后下面这个地方呢,就是根据枚举,再根据我们的原始的异常跟踪对象,呃,异常这跟踪链的这个对象来抛出我们的这个异常,所以呢,其实就是啊,提供了很多种不同的抛出异常对象的方法啊,把这些参数呢都给它灵活的去配置上,这样的话,未来我们去抛异常对象的时候呢,那你看方便用哪个你就用哪个啊,然后呢,接下来呢,我们在这个地方要抛的话呢,我们就抛一个什么呢啊这块呢,我们抛一个就是带啊带枚举的。
08:20
带枚举的,怎么抛呢?就是在这个地方叫棒。啊,Um啊,然后里面呢,我们有一个borrow amount no error,这之前呢,我们写过一个叫做借款额度不能为空这样的一个参数校验的这么一个错误嘛,所以呢,我们在这个地方就可以直接啊当啊。参数类型不合法的时候,或者是参数的值不合法的时候,我们直接呢,就以异常的形式直接抛出来了,那么以异常的形式抛出来之后,大家想这块其实就是我们说的这个啊,在。
09:00
程序中抛出这个一定自定义对象对不对,然后最后一个步骤呢,就是在统一异常中处理。在统一异常处理器中捕获这个自定义异常对象,那么我们说我们程序当中一旦发生了异常呢,都会来到哪呢?都会来到这个统一异常处理器当中被捕获,那么默认情况下呢,如果你这个异常对象呢,有明确的这样的一个方法补货了,那他就走这个方法,如果没有明确的方法补货你这个异常对象,那他就走这个方法,所以刚才我们在程序当中抛的这个。叫做business exception呢,目前为止在我们的同一上处理器当中呢,它并没有,所以他最终呢会走这个exception处理方法,那如何让他处理business exception呢?很简单,我们添加一个异常处理方法,然后把它呢变成business exception就可以了,所以这面呢也是business exception好这样的话呢,我们这个异常处理方法呢,我们就可以专门去处理啊,我们的自定义异常了啊,好,然后接下来呢,这个地方呢,我们还是一样log个errorr 1.message,然后呢,如果有原始的异常对象的话,我们就把原始的异常对象呢给它补获进来,并把错跟踪站打印出来,好,然后2.l,我们呢。
10:16
直接去设置一下我们的一点get message2点I,也就是说最终给前端返回的结果,我们的错误消息是在这个错误对象里拿到的,然后呢,我们的错误码点扣的啊,也是在这个错误对象里拿到的啊,因为我们自己定义的这个异常对象呢,它是有错误码和错误消息的,对不对?所以呢,在这个地方呢,我们是直接能够拿到啊,然后它这个里面的错误码和错误消息在哪封装的呢?是在这儿封装的,在这个地方你不是new了一个business对象嘛,好,然后new的这个对象最后呢,就会被传递到这儿了,然后这里面的错误码和错误消息呢,就来源于这个枚举,好,我们通过这个枚举来调用它的这个有参的构造函数接收一个枚举,通过这个枚举的message和code,给当前的这个business的exception啊,给这个business exception的message和code去赋值啊,这样的。
11:16
话呢,我们就有了这样的一个完整的自定义的一个异常理想,好这块呢,就是我们啊,整个一个代码的一个实现的流程了,那接下来呢,我们来做一个测试哈。好,我们的服呢,已经启动起来了,启动起来之后呢,我们来看一下啊,我们来测一下吧,比如说还是在啊刚才这个我们写异常的这个地方save方法啊,Save方法我们说比如说这borrow amount,这值呢,没空就没传是吧,前端参数传的有问题,然后接下来呢,我们直接就S保存。
12:10
啊,保存的时候呢,大家看这面就201借款额度不能为空,这就是刚才我们通过自定义异常所抛出的一个错误信息,那我们再来看一遍哈,在我们的controller这个里面,咱们判断它如果为no,我们就抛出自定义异常,而自定义常我们填的枚举是不是就是201借款额度不能为空啊好,那这个自定义异常呢,被在这个地方抛出来之后,它就会走这个unified exception handler unified exception handler里面呢,正好有一个方法是处理我们的自定义异常的,所以它就在这个地方呢,来打印我们的异常消息,然后呢,在这个地方呢,去返回给前端我们的异常结果,然后呢,我们异常结果呢,是从异常对象里取出刚才我们封装的错误码和错误消息就可以了,所以这块呢,就是我们所说的更灵活的自定义异常,那未来假设我们有其他类型的异常的话,那么我们呢,就不用再创建新的business exception了,也不用再创建新的exception。
13:10
看到了方法了。只需要我们在我们的。这个代码的业务当中去new这个basic exception,并且去定义不同的枚举就可以了。明白哈,再说一遍啊,就是以后如果有新的异常,我们没有必要在这个地方创建新的异常处理器,你比如说像这种你就必须创建新的异常处理器,对不对,你像这种你就不用了,那怎么做呢?只需要在我们的枚举当中创建一个新的枚举就可以了,然后我们呢,就统一都抛出这个business exception,然后呢,给它一个不同的枚举,这样的话呢,我前端就可以根据不同的枚举动态的展示不同的错误信息了啊好,这块呢,就是我们的一个自定义异常的一个处理方案。
我来说两句