SpringBoot异常的设计的原理

1,SpringBoot 中是BasicErrorController的基类来是实现错误的。
@Controller
@RequestMapping("KaTeX parse error: Expected '}', got 'EOF' at end of input: …ver.error.path:{error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {}
在springboot项目中,我们可以直接在类中通过局部方法处理异常,也可以继承BasicErrorController 来实现或通过@ControllerAdvice 注解做异常统一处理。在没有做处理时,springboot有默认的错误处理机制——显示默认的错误页面;默认的响应json数据(包含异常发生时间,异常状态,异常详细信息,发生异常的请求路径)。

SpringBoot异常的设计的原理
发生异常时,前端控制器调用全局异常处理器进行处理。

springboot默认错误处理机制:
源码中定制错误的响应规则,默认/error请求为错误请求;BasicErrorController,这个类是默认处理/error请求的,它包含errorHtml和error两个方法,前者返回ModelAndView,后者返回json数据;DefaultErrorViewResolver,指定浏览器响应的错误页面,发生异常时其中resolver方法会解析异常处理地址,得到与错误状态码对应的视图。

BasicErrorController这个类里面有两个方法 errorHtml()和error()方法

@RequestMapping(produces = "text/html")
public ModelAndView errorHtml(HttpServletRequest request,
        HttpServletResponse response) {
    response.setStatus(getStatus(request).value());
    Map<String, Object> model = getErrorAttributes(request,
            isIncludeStackTrace(request, MediaType.TEXT_HTML));
    return new ModelAndView("error", model);
}

@RequestMapping
@ResponseBody
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    Map<String, Object> body = getErrorAttributes(request,
            isIncludeStackTrace(request, MediaType.ALL));
    HttpStatus status = getStatus(request);
    return new ResponseEntity<Map<String, Object>>(body, status);
}
 


自定义异常处理:
1)直接在Controller做处理。在Controller处理异常的方法上加上@ExceptionHandler(需要处理的那些异常类);
2)通过@ControllerAdvice 注解来处理统一错误。自定义一个异常处理类加上@ControllerAdvice注解,通过@ExceptionHandler(指定异常类)触发不同的处理方法。

猜你喜欢

转载自blog.csdn.net/weixin_41146000/article/details/105197109