在我们做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.检验自定义异常
总结:测试得出,异常都可以统一处理了
技术
今日推荐