每個項目全局異常處理非常重要, 今天在處理項目架構的時候添加了一個全局異常處理。
大概三種異常情況:
一:在進入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("************************異常結束*******************************");
}
}
這兩個方法基本可以解決未處理異常問題,在其中可以添加自己的業務邏輯,自由發揮。
