原文地址:http://te-amo.site/user/article/info/ARTICLE20180223085118171
寫在前面的
在項目開發中異常是不可避免的問題,所以在項目中異常捕獲統一處理對一個應用來說顯得比較重要,對於開發人員來說便於找到錯誤的原因,對於用戶來說在出錯時也可以得到服務器的及時響應有較好的體驗。
一、邏輯業務處理前異常捕獲
這種異常大多是資源請求的錯誤,例如錯誤的url地址所引起的404異常。
處理這種異常需要實現ErrorController接口,代碼如下:
@Controller
public class ResourceExceptionHandler implements ErrorController {
private static Logger logger = Logger.getLogger(ResourceExceptionHandler.class.getName());
@Override
public String getErrorPath() {
return "/error";
}
/**
*處理需要返回和html頁面的異常
**/
@RequestMapping(value = "/error",produces = "text/html")
public ModelAndView errorHtml(HttpServletResponse resp, HttpServletRequest req) {
logger.info("page not found");
return new ModelAndView("404.html");
}
/**
*處理需要返回JSON數據的異常
**/
@RequestMapping(value = "/error")
@ResponseBody
public Object error(HttpServletResponse resp, HttpServletRequest req) {
logger.info("ResponseBody not found");
return "ResourceExceptionHandler ResponseBody";
}
}
二、執行@RequestMapping時異常捕獲
這種異常主要包括參數的不匹配,參數轉換等異常
處理這種異常使用@ControllerAdvice和繼承ResponseEntityExceptionHandler示例代碼如下:
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
/**
* 參數不足異常
* 這裏只列舉了一個方法
* 如果需要處理其他的異常可以查看ResponseEntityExceptionHandler的源碼,可以重寫你需要的異常處理方法
*/
@Override
protected ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
return new ResponseEntity<Object>(ex.getMessage(), status);
}
}
三、邏輯業務處理中異常捕獲
邏輯業務處理中的異常,主要是指在處理業務邏輯時可能會發生各種問題,如空指針,數據庫錯誤等。
(1)使用Html模板渲染的應用
這種應用異常處理,需要實現HandlerExceptionResolver接口
@Component
public class ModelAndViewExceptionHandler implements HandlerExceptionResolver {
private static Logger logger = Logger.getLogger(ModelAndViewExceptionHandler.class.getName());
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
logger.info("ModelAndView 異常");
return new ModelAndView("error.html");
}
}
(2)restful風格應用
處理此種應用的異常使用@ControllerAdvice和@ExceptionHandler註解
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Object exceptionHandler(HttpServletRequest request, Exception e) throws Exception {
logger.info("異常處理邏輯");
return "error";
}
}