一、没有做异常处理时
在controller中的随便一个方法中加一个异常
然后在swagger中测试
可以看到有默认的异常处理方式。
那我们想要自定义异常处理方式,比如返回一些友好的提示,该如何去做呢?
二、全局统一处理
1、创建统一异常处理类
在service-base中创建exceptionhandler包,在包下创建统一异常处理类GlobalExceptionHandler.java:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) @ResponseBody //为了返回数据 public R error(Exception e){ e.printStackTrace(); return R.error().message("执行了全局异常方法"); } }
2、注意循坏依赖
因为要使用R做统一数据返回,所以要在 service-base 中引入common_utils的依赖;
同时,我们在service中同时引入了service_base和common_utils,现在service-base中已经有了common_utils,所以我们需要在service中把common_utils的依赖删掉,避免重复引入。
3、测试
可以看到,并没有报错(这说明前端不会显示巨丑的报错页面),而是返回了我们定义的友好提示。
三、特定异常处理
现在我们希望对一些特定的异常,抛出特定的提示。
其实在实际开发中用到的并不是很多,因为我们往往不清楚程序会报什么异常。
比如还是这个除数为0的ArithmeticException错误
1、代码
@ExceptionHandler(ArithmeticException.class) @ResponseBody //为了返回数据 public R error(ArithmeticException e){ e.printStackTrace(); return R.error().message("执行了ArithmeticException异常处理方法"); }
2、测试
可以看到返回的不再是全局异常处理方法,而是我们为这个异常特定的提示。
三、自定义异常处理
现在我们想自定义自己的异常处理方法
1、代码
新建一个GuliException类
@Data @AllArgsConstructor @NoArgsConstructor public class GuliException extends RuntimeException{ private Integer code; //状态码 private String msg; //异常信息 }
2、变为全局异常
在GlobalExceptionHandler类中加上这个异常
@ExceptionHandler(GuliException.class) @ResponseBody //为了返回数据 public R error(GuliException e){ e.printStackTrace(); return R.error().code(e.getCode()).message(e.getMsg()); }
3、抛出
由于不是官方给出的异常,系统不会自动抛出,我们需要自己手动抛出
try { int n = 10 / 0; } catch (Exception e) { throw new GuliException(20001, "执行了自定义异常处理"); }
4、测试