首先我把異常分爲兩種,一種是可控制的,或者是由咱們發現條件不正確主動拋出的異常,就像前城市編號不存在那個粟子;另外一種是不可控制的,或者說是程序存在bug引發的異常,但這種異常也不想變態的就直接給前端拋出個500異常。前端
實現步驟以下:java
新建一個 DescribeException 類,在主動拋出異常時就拋出一個 DescribeException 類實例。它包含兩個屬性 code和message 。code是要拋出的異常代碼用http狀態碼來表示,message是想要告訴前端的信息,如「參數驗證錯誤」之類的。web
/** * Name:RESTException * Description: 異常信息 */ public class DescribeException extends Exception {
int code;//狀態代碼 String message;//異常提示信息 public int getCode() { return code; } public void setCode(int code) { this.code = code; } @Override public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
建立一個異常處理器,它有兩個異常處理方法,一個處理主動拋出的異常,一個處理非主動異常。spring
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; /** * Name:APIExceptionHandler * Description: */ @ControllerAdvice public class APIExceptionHandler {
Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 處理業務發現問題主動拋出的異常 * @param request * @param e * @return * @throws Exception */ @ExceptionHandler(value = DescribeException.class) @ResponseBody public ResponseEntity<DescribeException> baseErrorHandler(HttpServletRequest request, DescribeException e) throws Exception { //把錯誤輸出到日誌 logger.error("DescribeException Handler---Host: {} invokes url: {} ERROR: {}", request.getRemoteHost(), request.getRequestURL(), e.getMessage()); return new ResponseEntity<DescribeException>(e, HttpStatus.valueOf(e.getCode())); } /** * 系統拋出的沒有處理過的異常 * @param request * @param e * @return * @throws Exception */ @ExceptionHandler(value = Exception.class) @ResponseBody public ResponseEntity<Exception> defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception { //把錯誤輸出到日誌 logger.error("DefaultException Handler---Host: {} invokes url: {} ERROR: {}", request.getRemoteHost(), request.getRequestURL(), e.getMessage()); return new ResponseEntity<Exception>(new Exception("參數驗證錯誤!"), HttpStatus.INTERNAL_SERVER_ERROR); } }
主異常處理方法將傳遞業務處理中的異常提示信息給前端,非主動異常處理方法將統一返回一種異常提示信息到前端。ide
thow new DescribeException(HttpStatus.INTERNAL_SERVER_ERROR.value(),"自定義錯誤信息");