问题背景
公司一个小程序后台的项目,一报错就返回一个html页面,实在蛋疼, 按道理,json接口,有问题,应该也是json格式返回,哪怕格式再补标准,但是至少也要可以返回可以跟踪调试错误的信息。
所以对项目进行了改造,只需要引入一个类,即可捕获全局异常。如果有自定义类型的异常,可以@ExceptionHandler(Exception.class)这里设置,
实战
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Object defaultExceptionHandler(HttpServletRequest req, Exception e) {
e.printStackTrace();
return new ApiReturnObject("01","server error", e.getMessage());
//这里的return错误信息,可以自定义,一般项目都有自定义返回的类
//return e.getMessage();
//return "{\"errorCode\":\"9\",\"errorMessage\":\""+e.getMessage()+"\"}";
}
}
知识补充
Spring能够较好的处理异常处理的问题问题,核心如下,文章主要关注前两个:
- @ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度
- @ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理剥离开
- @ResponseStatus:可以将某种异常映射为HTTP状态码
这里我们主要讲@ExceptionHandler,该注解作用对象为方法,并且在运行时有效,value()可以指定异常类。由该注解注释的方法可以具有灵活的输入参数(详细参见Spring API):
异常参数:包括一般的异常或特定的异常(即自定义异常),如果注解没有指定异常类,会默认进行映射。
请求或响应对象 (Servlet API or Portlet API):
- ServletRequest/HttpServletRequest、
- PortleRequest/ActionRequest/RenderRequest。
- Session对象(Servlet API or Portlet API): HttpSession或PortletSession。
WebRequest或NativeWebRequest - Locale
- InputStream/Reader
- OutputStream/Writer
- Model
方法返回值可以为:
- ModelAndView对象
- Model对象
- Map对象
- View对象
- String对象
- @ResponseBody
- HttpEntity<?>
- ResponseEntity<?>
- void