实际项目开发中,程序往往会发生各式各样的异常情况,特别是身为服务端开发人员的我们,总是不停的编写接口提供给前端调用,分工协作的情况下,避免不了异常的发生,如果直接将错误的信息直接暴露给用户,这样的体验可想而知,且对黑客而言,详细异常信息往往会提供非常大的帮助…
初窥异常
一个简单的异常请求的接口
@GetMapping("/test")
public String test() {
// TODO 这里只是模拟异常,假设业务处理的时候出现错误了,或者空指针了等等...
int i = 10/0;
return "test1";
}
通过swagger调用:
{
"timestamp": "2019-01-28T06:38:42.517+0000",
"status": 500,
"error": "Internal Server Error",
"message": "/ by zero",
"path": "/order/test"
}
如果这接口是给第三方调用或者是自己公司的系统,看到这种错误估计得暴走吧….
全局处理异常(自己定义返回模板)
自定义异常
在应用开发过程中,除系统自身的异常外,不同业务场景中用到的异常也不一样,为了与标题 轻松搞定全局异常 更加的贴切,定义个自己的异常,看看如何捕获…
/**
* 自定义异常
*/
public class BusinessErrorException extends RuntimeException {
private int code;
public BusinessErrorException() {
super();
}
public BusinessErrorException(ErrorCodeEnum errorCodeEnum) {
super(errorCodeEnum.getMsg());
this.setCode(errorCodeEnum.getCode());
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
异常信息模板
定义返回的异常信息的格式,这样异常信息风格更为统一。
public class ErrorResponseEntity {
private int code;
private String message;
public ErrorResponseEntity(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
控制层
仔细一看是不是和平时正常写的代码没啥区别,不要急,接着看….
@GetMapping("/test")
public String test(@RequestParam int num) {
if(num < 0) {
throw new BusinessErrorException(ErrorCodeEnum.MY_TEST_EXCEPTION);
}
int i = 10/num;
return "result" + i;
}
异常处理(关键)
注解概述
- @ControllerAdvice 捕获 Controller 层抛出的异常,如果添加 @ResponseBody 返回信息则为JSON格式。
- @RestControllerAdvice 相当于 @ControllerAdvice 与 @ResponseBody 的结合体。
- @ExceptionHandler 统一处理一种类的异常,减少代码重复率,降低复杂度。
创建一个 GlobalExceptionHandler 类,并添加上 @RestControllerAdvice 注解就可以定义出异常通知类了,然后在定义的方法中添加上 @ExceptionHandler 即可实现异常的捕捉…
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
/**
* 定义要捕获的异常 可以多个 @ExceptionHandler({})
*
* @param request request
* @param e exception
* @param response response
* @return 响应结果
*/
@ExceptionHandler(BusinessErrorException.class)