在我们做web系统的时候,难免会出现各种各样的异常,但是这种异常,不能直接显示在客户端,所以我们服务端就需要做统一处理,统一返回格式给客户端
这里用到了spring的两个注解:@ControllerAdvice---控制器增强和@ExceptionHandler ---异常处理
下面来看看具体的实现,建立一个类,加上@ControllerAdvice注解
/**
* 统一异常处理类
*/
@ControllerAdvice
public class MyExceptionHandler {
private static Logger logger = LoggerFactory.getLogger(MyExceptionHandler.class);
/**
* 参数解析失败异常处理
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseBody
public ResponseResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e, HttpServletRequest request) {
logger.error(request.getRequestURI() + ":参数解析失败",e);
return new ResponseResult(HttpStatus.BAD_REQUEST.value(),"参数解析失败");
}
/**
* 不支持当前请求方法异常处理
*/
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseBody
public ResponseResult handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e, HttpServletRequest request) {
logger.error(request.getRequestURI() + ":不支持当前请求方法",e);
return new ResponseResult(HttpStatus.METHOD_NOT_ALLOWED.value(),"不支持当前请求方法");
}
/**
* 项目运行异常处理
*/
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseResult handleException(Exception e, HttpServletRequest request) {
logger.error(request.getRequestURI() + ":服务运行异常",e);
return new ResponseResult(HttpStatus.INTERNAL_SERVER_ERROR.value(),"服务运行异常");
}
/**
* 自定义异常处理
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(MyException.class)
@ResponseBody
public ResponseResult handleException(MyException e, HttpServletRequest request) {
logger.error(request.getRequestURI() + ":自定义内部异常",e.getMsg());
return new ResponseResult(e.getCode(),e.getMsg());
}
}
这里只是举例经常遇到的几个异常,具体的项目运行异常还可以细分,如空指针、类型转换异常、IO异常等
最后一个就是自定义异常处理
@Data
public class MyException extends RuntimeException{
//错误吗
private Integer code;
//错误信息
private String msg;
public MyException(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}
下面来检验一下,统一处理异常是否生效
1.检验请求类型,我们用get请求方式去测试
2.检验服务器运行异常,我们故意在代码中写个异常来测试(应该抛出java.lang.ArithmeticException: / by zero)
3.检验自定义异常
总结:测试得出,异常都可以统一处理了