自定義異常
自定義Exception
定義一個Excpetion在發生錯誤的時候拋出,然后被異常處理類處理轉發到對應異常頁面
/** * 自定義異常類 */ public class TestException extends RuntimeException { public TestException() { } public TestException(String message) { super(message); } public TestException fail(String message) { throw new TestException(message); } }
前端異常頁面
因為主要的目的是跳轉 所以隨便寫幾個顯示錯誤的頁面
Controller層異常處理
import com.newbee.mall.util.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; @RestControllerAdvice public class TestHandlerController { //該注解表示這個方法可以處理所有的異常 @ExceptionHandler(Exception.class) public Object handlerException(HttpServletRequest request, Exception e) { //自定義結果集Result Result result = new Result(); result.setResultCode(500); //判斷是否為自定義異常 if (e instanceof TestException) { result.setMessage(e.getMessage()); } else { e.printStackTrace(); result.setMessage("未知異常!請聯系管理員!"); } //檢查請求是否為ajax, 如果是 ajax 請求則返回 Result json串, 如果不是 ajax 請求則返回 error 視圖 String contentTypeHeader = request.getHeader("Content-Type"); String acceptHeader = request.getHeader("Accept"); String xRequestedWith = request.getHeader("X-Requested-With"); if ((contentTypeHeader != null && contentTypeHeader.contains("application/json")) || (acceptHeader != null && acceptHeader.contains("application/json")) || "XMLHttpRequest".equalsIgnoreCase(xRequestedWith)) { return result; } else { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", e.getMessage()); modelAndView.addObject("url", request.getRequestURL()); modelAndView.addObject("stackTrace", e.getStackTrace()); modelAndView.setViewName("error/error"); return modelAndView; } } }
所有訪問到Controller請求的異常都會被處理,如果是ajax請求就返回Json對象,如果不是ajax請求就跳轉到error頁面,顯示出異常信息
全局異常處理
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.error.ErrorAttributes; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import java.util.Map; @Controller public class ErrorPageController implements ErrorController { private static ErrorPageController errorPageController; @Autowired private ErrorAttributes errorAttributes; private final static String ERROR_PATH = "/error"; public ErrorPageController(ErrorAttributes errorAttributes) { this.errorAttributes = errorAttributes; } public ErrorPageController() { if (errorPageController == null) { errorPageController = new ErrorPageController(errorAttributes); } } @RequestMapping(value = ERROR_PATH, produces = "text/html") public ModelAndView errorHtml(HttpServletRequest request) { HttpStatus status = getStatus(request); if (HttpStatus.BAD_REQUEST == status) { return new ModelAndView("error/error_400"); } else if (HttpStatus.NOT_FOUND == status) { return new ModelAndView("error/error_404"); } else { return new ModelAndView("error/error_5xx"); } } @RequestMapping(value = ERROR_PATH) @ResponseBody public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request)); HttpStatus status = getStatus(request); return new ResponseEntity<Map<String, Object>>(body, status); } @Override public String getErrorPath() { return ERROR_PATH; } private boolean getTraceParameter(HttpServletRequest request) { String parameter = request.getParameter("trace"); if (parameter == null) { return false; } return !"false".equals(parameter.toLowerCase()); } protected Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) { WebRequest webRequest = new ServletWebRequest(request); return this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace); } private HttpStatus getStatus(HttpServletRequest request) { Integer statusCode = (Integer) request .getAttribute("javax.servlet.error.status_code"); if (statusCode != null) { try { return HttpStatus.valueOf(statusCode); } catch (Exception ex) { } } return HttpStatus.INTERNAL_SERVER_ERROR; } }
除了訪問controller之外的所有異常都會被處理 根據httpStatusCode來判斷是哪種異常並跳轉到對應頁面