每個項目全局異常處理非常重要, 今天在處理項目架構的時候添加了一個全局異常處理。
大概三種異常情況:
一:在進入Controller之前,譬如請求一個不存在的地址,404錯誤。
二:在執行@RequestMapping時,進入邏輯處理階段前。譬如傳的參數類型錯誤。
三:以上都正常時,在controller里執行邏輯代碼時出的異常。譬如NullPointerException。
一
@RestController public class FinalExceptionHandler implements ErrorController { @Override public String getErrorPath() { return "/error"; } @RequestMapping(value = "/error") public Object error(HttpServletResponse resp, HttpServletRequest req) { // 錯誤處理邏輯 return "其他異常"; } }
二、三
import static org.springframework.http.HttpStatus.NOT_EXTENDED; /** * Created by mazhq on 2018/7/10 * 全局異常處理 */ @ControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 在controller里面內容執行之前,校驗一些參數不匹配啊,Get post方法不對啊之類的 */ @Override protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { System.out.println("錯誤"); return new ResponseEntity<Object>(BaseCode.retCode(ResultCode.parmFarmat).toString(), NOT_EXTENDED); } @ExceptionHandler(value = Exception.class) @ResponseBody public String jsonHandler(HttpServletRequest request, Exception e) { logger.error("請求路徑:"+request.getRequestURL().toString()+"; 發生錯誤!"); log(e, request); return BaseCode.retCode(ResultCode.failure).toString(); } private void log(Exception ex, HttpServletRequest request) { logger.error("************************異常開始*******************************"); logger.error("異常信息:", ex); logger.error("請求地址:" + request.getRequestURL()); Enumeration enumeration = request.getParameterNames(); logger.error("請求參數"); while (enumeration.hasMoreElements()) { String name = enumeration.nextElement().toString(); logger.error(name + "---" + request.getParameter(name)); } StackTraceElement[] error = ex.getStackTrace(); for (StackTraceElement stackTraceElement : error) { logger.error(stackTraceElement.toString()); } logger.error("************************異常結束*******************************"); } }
這兩個方法基本可以解決未處理異常問題,在其中可以添加自己的業務邏輯,自由發揮。