Spring Boot 默认的异常处理机制可以根据不同的异常类型,自动返回对应的 HTTP 状态码,同时输出异常信息,帮助我们快速定位错误。
默认情况下,无需显式配置,Spring Boot 就可以捕获控制器方法抛出的异常及一些框架内部异常。当异常被捕获后,Spring Boot 会根据异常类型来自动选择以下处理步骤:
- 如果是 HTTP 400 错误,返回 Bad Request 响应码。
- 如果是 HTTP 404 错误,返回 Not Found 响应码。
- 如果是 HTTP 405 错误,返回 Method Not Allowed 响应码。
- 如果是 HTTP 415 错误,返回 Unsupported Media Type 响应码。
- 如果是 HTTP 406 错误,返回 Not Acceptable 响应码。
- 如果异常时运行时异常(RuntimeException),则返回 HTTP 500 Internal Server Error 响应码。
- 如果是其他异常,则返回我们设定的默认响应码。
此外,Spring Boot 还提供了自定义异常处理机制。我们可以通过编写一个全局异常处理器,来捕获 Spring Boot 在处理异常时未能成功处理的异常,并对异常进行特定的处理操作。以下是一个示例代码:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public BaseResponse handleException(HttpServletRequest request, Exception e) {
BaseResponse response = new BaseResponse();
response.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
response.setMessage(e.getMessage());
return response;
}
@ExceptionHandler(BusinessException.class)
@ResponseBody
public BaseResponse handleBusinessException(HttpServletRequest request, BusinessException ex) {
BaseResponse response = new BaseResponse();
response.setCode(ex.getCode());
response.setMessage(ex.getMessage());
return response;
}
}
上述示例代码中,我们通过使用 @ControllerAdvice
注解声明全局异常处理器,然后通过使用 @ExceptionHandler
注解来处理具体的异常类型。当 Spring Boot 在处理异常时遇到了这些异常类型时,就使用对应的处理函数来返回相应的结果。
例如,在上述示例中处理 BusinessException
时,返回的结果中包含了自定义错误码和错误信息。
另外,我们也可以通过重写 Spring Boot 提供的 ErrorController 接口,来自定义异常的返回信息格式和内容,以下是一个示例代码:
@RestController
public class CustomErrorController implements ErrorController {
@RequestMapping("/error")
public BaseResponse handleError(HttpServletRequest request) {
BaseResponse response = new BaseResponse();
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == HttpStatus.NOT_FOUND.value()) {
response.setCode(HttpStatus.NOT_FOUND.value());
response.setMessage("Sorry, the resource you requested is not found.");
} else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
response.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
response.setMessage("Sorry, something unexpected happened.");
} else {
response.setCode(statusCode);
response.setMessage("Sorry, an error occurred.");
}
return response;
}
@Override
public String getErrorPath() {
return "/error";
}
}
上述示例代码中,我们通过实现 ErrorController
接口,将 /error
请求路由到一个新的函数中处理。在这个处理函数中,我们可以根据请求的 HTTP 响应码来自定义异常信息的格式和内容。
例如,当请求出现 404 错误时,返回的结果中会包含 “Sorry, the resource you requested is not found.” 的提示信息。
总的来说,Spring Boot 提供了默认的异常处理机制,并允许我们通过自定义异常处理器和重写 ErrorController 接口来进一步扩展和定制这一机制,以便更好地适应我们的应用程序需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot 默认异常处理的实现 - Python技术站