SpringBoot 爲API添加統一的異常處理(一)

首先我把異常分爲兩種,一種是可控制的,或者是由咱們發現條件不正確主動拋出的異常,就像前城市編號不存在那個粟子;另外一種是不可控制的,或者說是程序存在bug引發的異常,但這種異常也不想變態的就直接給前端拋出個500異常。前端

實現步驟以下:java

第1步,新建一個Exception類

新建一個 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; } }

第2步,建一個異常拼接器

建立一個異常處理器,它有兩個異常處理方法,一個處理主動拋出的異常,一個處理非主動異常。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

第3步,在業務中拋出自定義異常

thow new DescribeException(HttpStatus.INTERNAL_SERVER_ERROR.value(),"自定義錯誤信息");
相關文章
相關標籤/搜索