异常处理问题分析
异常如何处理
问题引入
针对代码中的异常,常规有两种处理方式,一种throws直接抛出,另一种try..catch捕获。
在java项目中,有可能存在人为逻辑的异常,也可能为取得异常的详情,或是保证程序在异常时继续向下执行,会采用第二种处理方式。
但是,代码中每一处异常都来捕获,会使代码什么冗余且不利于维护。
解决思路
定义一个全局异常处理类,返回统一规范的异常信息;
处理逻辑是,先判定是否会出现异常,再执行后续具体的业务。
业务举例
本文主要为了实现全局异常处理的逻辑,只举简单业务
某公司部门需增加员工,处理流程:1先根据员工编号查询员工对象,2判断员工对象是否有信息,即是否不为空,3若有信息,则说明已存在,无需再添加,若不是,则直接添加。
代码如下:
1 | public class MyService { |
异常处理流程
业务中存在运行时异常和业务逻辑异常,前者不运行时很难察觉,后者在遍及业务时就可以定义出来,因此异常分为不可预知异常和可知异常。流程如下:
- 自定义全局异常类,使用
@ControllerAdvice
,控制器增强 - 自定义错误代码及错误信息,两种异常最终会采用统一的信息格式来表示,错误代码+错误信息。
- 对于可预知的异常由程序员在代码中主动抛出,由
SpringMVC
统一捕获。 - 不可预知异常通常是由于系统出现bug、或一些外界因素(如网络波动、服务器宕机等),异常类型为
RuntimeException
类型(运行时异常)。
可知异常
定义异常信息类,变量为错误代码和错误信息,捕获自定义异常时,直接将该对象返回
不可知异常
定义一个map,将常见的异常存入其中,并定义错误代码。对于其他不常见的异常,即map中没有的,同一一个异常对象返回即可。
异常处理代码流程
可知异常
1、定义打印异常信息与返回结果的接口
1 | public interface ResultCode { |
1 | public interface Response { |
2、定义打印异常信息的枚举类和返回结果类
1 |
|
1 |
|
3、定义错误异常类
1 | public class CustomException extends RuntimeException{ |
4、定义异常抛出类
1 | public class ExceptionCast { |
5、定义异常捕获类,使用ControllerAdvice
控制器增强的注解,并在捕获CustomException异常的方法上加ExceptionHandler
注解,即可捕获该类的所有异常,返回json数据。
1 |
|
6、在业务中抛出异常
1 | public class MyService { |
不可知异常处理
1、类似可知异常,先添加错误代码,如
1 | UNAUTHORISE(false,510,"没有权限"), |
2、在异常捕获类中添加不可知异常的捕获方法。该方法中,定义一个只读的map存储异常类型的错误代码的映射,map中没有的元素,同一用错误代码999来定义。
1 | UNKNOWNERROR(false,999,"未知异常"), |
1 |
|
完成~~
不可知异常处理
###