>  기사  >  Java  >  SpringBoot 예외 처리 원칙 분석

SpringBoot 예외 처리 원칙 분석

WBOY
WBOY앞으로
2023-05-13 23:28:131251검색

예외 처리 프로세스

대상 메서드를 실행합니다. 대상 메서드 실행 중 모든 예외는 catch에 의해 캡처되고 dispatchException 발생의 끝을 표시합니다. 예외catch捕获,并标志当前请求结束,dispatchException抛出异常

SpringBoot 예외 처리 원칙 분석

进入视图解析流程,并渲染页面,发生异常时,参数mv为空,传入捕获的异常dispatchException

SpringBoot 예외 처리 원칙 분석

处理handler发生的异常,处理完成返回ModelAndView

SpringBoot 예외 처리 원칙 분석

(1)遍历所有的HandlerExceptionResolvers,找到可以处理当前异常的解析器来解析异常

SpringBoot 예외 처리 원칙 분석

(2)调用resolveException解析异常,传入requestresponse对象,哪个方法,发生的异常,然后自定义异常处理返回ModelAndView

SpringBoot 예외 처리 원칙 분석

(3)系统默认的异常解析器

SpringBoot 예외 처리 원칙 분석

① DefaultErrorAttributes先来处理异常,把异常信息保存到request域并返回null

SpringBoot 예외 처리 원칙 분석

② ExceptionHandlerExceptionResolver用来处理标注了@ExceptionHandler注解的方法异常

③ ResponseStatusExceptionResolver用来处理标注了@ResponseStatus注解的方法异常

④ DefaultHandlerExceptionResolver默认的处理器异常解析器,处理一些常见的异常

(4)如果没有任何解析器能够处理异常,异常就会抛出

SpringBoot 예외 처리 원칙 분석

(5)如果没有任何解析器能够处理当前异常,最终就会发送/error请求,将保存的异常信息转发到/errorBasicErrorController专门来处理/error请求,BasicErrorController会遍历所有的ErrorViewResolver解析错误视图,如果没有自定义的错误视图解析器,就会使用默认的DefaultErrorViewResolver,会把响应码作为错误页的地址,模板引擎最终响应这个页面。

几种异常处理方式及原理

1.自定义错误页,error/404.htmlerror/5xx.html。有精确的错误状态码页面就匹配精确,没有就找 4xx.html,如果都没有就触发白页

2.使用@ControllerAdvice@ExceptionHandler处理全局异常,底层是ExceptionHandlerExceptionResolver 支持的

SpringBoot 예외 처리 원칙 분석

3.使用@ResponseStatus和自定义异常。底层是 ResponseStatusExceptionResolver ,底层调用 response.sendError(statusCode, resolvedReason),Tomcat会收到一个error。请求最后new一个空的ModelAndView返回,这样任何处理解析器都处理不了当前的异常,最终就会发送/error请求,BasicErrorController专门来处理/error请求,适配4xx.html或者5xx.html页面

SpringBoot 예외 처리 원칙 분석

4.Spring底层的异常,如参数类型转换异常。底层是DefaultHandlerExceptionResolver 处理框架底层的异常,底层也是response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE),Tomcat会收到一个error。请求最后new一个空的ModelAndView返回,这样任何处理解析器都处理不了当前的异常,最终就会发送/error请求,BasicErrorController专门来处理/error请求,适配4xx.html或者5xx.html

SpringBoot 예외 처리 원리 분석🎜🎜보기로 들어가기 파싱 ​​프로세스 및 페이지 렌더링, 예외가 발생하면 mv 매개변수가 비어 있고 캡처된 예외 dispatchException🎜🎜SpringBoot 예외 처리 원리 분석🎜🎜 핸들러에서 발생하는 예외를 처리하고 ModelAndView 처리 완료 후🎜🎜 SpringBoot 예외 처리 원리 분석 🎜🎜 (1) 모든 HandlerExceptionResolvers를 탐색하고 현재 예외를 처리할 수 있는 확인자를 찾아 예외를 해결합니다🎜🎜SpringBoot 예외 처리 원칙 분석🎜🎜(2) resolveException을 호출하여 예외를 해결하고 요청 및 응답 개체, 어느 메서드에서 예외가 발생한 다음 사용자 지정 예외 처리가 ModelAndView🎜🎜SpringBoot 예외 처리의 원리 분석🎜🎜(3) 시스템 기본 예외 파서🎜🎜SpringBoot 예외 처리 원리 분석🎜🎜① DefaultErrorAttributes 먼저 예외 처리 , 예외 정보를 요청 필드에 저장하고 null🎜🎜SpringBoot 예외 처리 원리 분석🎜🎜② ExceptionHandlerExceptionResolver@ExceptionHandler로 주석이 달린 메소드 예외를 처리하는 데 사용됩니다. ResponseStatusExceptionResolver@ ResponseStatus 주석이 달린 메서드 예외🎜🎜4로 주석이 달린 예외를 처리하는 데 사용됩니다. DefaultHandlerExceptionResolver기본 프로세서 예외 구문 분석기는 몇 가지 일반적인 예외를 처리합니다🎜🎜 (4) 예외를 처리할 수 있는 파서가 없으면 예외가 발생합니다. 🎜🎜🎜🎜 (5) 현재 예외를 처리할 수 있는 파서가 없으면 결국 /error 요청이 전송되고 저장된 예외 정보가 /error. <code>BasicErrorController/error 요청을 처리하는 데 사용됩니다. BasicErrorController는 오류 보기를 구문 분석하기 위해 모든 ErrorViewResolver를 순회합니다. 사용자 정의가 없습니다. 오류 보기 확인자는 응답 코드를 오류 페이지의 주소로 사용하는 기본 DefaultErrorViewResolver를 사용하고 템플릿 엔진은 결국 이 페이지에 응답합니다. 🎜

여러 가지 예외 처리 방법 및 원칙🎜🎜1. 사용자 정의 오류 페이지, error/404.html, error/5xx.html code> . 정확한 오류 상태 코드 페이지가 있으면 정확하게 일치합니다. 페이지가 없으면 <code>4xx.html을 찾으세요. 2. 사용하세요. @ControllerAdvice @ExceptionHandler는 전역 예외를 처리합니다. 맨 아래 계층은 ExceptionHandlerExceptionResolver🎜🎜SpringBoot 예외 처리의 원리 분석🎜🎜3. @ResponseStatus 및 사용자 정의 예외를 사용하세요. 맨 아래 레이어는 ResponseStatusExceptionResolver입니다. 맨 아래 레이어는 response.sendError(statusCode, receivedReason)를 호출하고 Tomcat은 error를 수신합니다. 요청이 끝나면 new는 빈 ModelAndView를 반환하므로 처리 파서가 현재 예외를 처리할 수 없으며 /error 요청 BasicErrorController/error 요청을 처리하고 4xx.html 또는 5xx.html에 적응하는 데 특별히 사용됩니다. code> 페이지🎜🎜<img src="https://img.php.cn/upload/article/000/887/227/168399169618365.png" alt="SpringBoot 예외 처리 원리 분석"><br> 🎜🎜4. 매개변수 유형 변환 예외와 같은 Spring 기본 예외. 맨 아래 레이어는 프레임워크 맨 아래에서 예외를 처리하는 <code>DefaultHandlerExceptionResolver입니다. 맨 아래 레이어도 response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE)입니다. 오류. 요청이 끝나면 new는 빈 ModelAndView를 반환하므로 처리 파서가 현재 예외를 처리할 수 없으며 /error 요청 BasicErrorController/error 요청을 처리하고 4xx.html 또는 5xx.html에 적응하는 데 특별히 사용됩니다. 코드> 페이지🎜<pre class="brush:php;toolbar:false">protected ModelAndView doResolveException( HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) { try { if (ex instanceof HttpRequestMethodNotSupportedException) { return handleHttpRequestMethodNotSupported( (HttpRequestMethodNotSupportedException) ex, request, response, handler); } else if (ex instanceof HttpMediaTypeNotSupportedException) { return handleHttpMediaTypeNotSupported( (HttpMediaTypeNotSupportedException) ex, request, response, handler); } else if (ex instanceof HttpMediaTypeNotAcceptableException) { return handleHttpMediaTypeNotAcceptable( (HttpMediaTypeNotAcceptableException) ex, request, response, handler); } else if (ex instanceof MissingPathVariableException) { return handleMissingPathVariable( (MissingPathVariableException) ex, request, response, handler); } else if (ex instanceof MissingServletRequestParameterException) { return handleMissingServletRequestParameter( (MissingServletRequestParameterException) ex, request, response, handler); } else if (ex instanceof ServletRequestBindingException) { return handleServletRequestBindingException( (ServletRequestBindingException) ex, request, response, handler); } else if (ex instanceof ConversionNotSupportedException) { return handleConversionNotSupported( (ConversionNotSupportedException) ex, request, response, handler); } else if (ex instanceof TypeMismatchException) { return handleTypeMismatch( (TypeMismatchException) ex, request, response, handler); } else if (ex instanceof HttpMessageNotReadableException) { return handleHttpMessageNotReadable( (HttpMessageNotReadableException) ex, request, response, handler); } else if (ex instanceof HttpMessageNotWritableException) { return handleHttpMessageNotWritable( (HttpMessageNotWritableException) ex, request, response, handler); } else if (ex instanceof MethodArgumentNotValidException) { return handleMethodArgumentNotValidException( (MethodArgumentNotValidException) ex, request, response, handler); } else if (ex instanceof MissingServletRequestPartException) { return handleMissingServletRequestPartException( (MissingServletRequestPartException) ex, request, response, handler); } else if (ex instanceof BindException) { return handleBindException((BindException) ex, request, response, handler); } else if (ex instanceof NoHandlerFoundException) { return handleNoHandlerFoundException( (NoHandlerFoundException) ex, request, response, handler); } else if (ex instanceof AsyncRequestTimeoutException) { return handleAsyncRequestTimeoutException( (AsyncRequestTimeoutException) ex, request, response, handler); } } catch (Exception handlerEx) { if (logger.isWarnEnabled()) { logger.warn(&quot;Failure while trying to resolve exception [&quot; + ex.getClass().getName() + &quot;]&quot;, handlerEx); } } return null; }</pre> <p>5. <code>HandlerExceptionResolver의 사용자 정의 구현은 예외를 처리하고 기본 전역 예외 처리 규칙HandlerExceptionResolver 处理异常,可以作为默认的全局异常处理规则

@Order(value = Ordered.HIGHEST_PRECEDENCE)
@Component
public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        try {
            response.sendError(521,"I love you !");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ModelAndView();
    }
}

SpringBoot 예외 처리 원칙 분석

ErrorViewResolver 实现自定义处理异常。

(1)底层调用response.sendError时 ,error请求就会默认转给basicErrorControllerBasicErrorController专门来处理/error请求,适配4xx.html或者5xx.html页面

(2)如果异常没有任何解析器能处理,tomcat底层 也会调用response.sendErrorerror请求就会默认转给basicErrorControllerBasicErrorController专门来处理/error请求,适配4xx.html或者5xx.html页面。

(3)basicErrorController 要去的页面地址是由 ErrorViewResolver这个错误视图解析器决定的,即适配4xx.html或者5xx.htmlrrreee

SpringBoot 예외 처리의 원리 분석🎜🎜ErrorViewResolver는 사용자 정의 예외 처리를 구현합니다. 🎜🎜(1) 하위 레이어에서 response.sendError를 호출하면 error 요청은 기본적으로 basicErrorController로 전달되고 BasicErrorController /error 요청을 처리하고 4xx.html 또는 5xx.html 페이지에 적응하는 데 특별히 사용됩니다. 🎜🎜 (2) 있는 경우 예외는 파서가 처리할 수 없으며 Tomcat 하단 레이어도 response.sendError를 호출합니다. error 요청은 기본적으로 basicErrorController로 전달됩니다. BasicErrorController/error 요청을 처리하고 이에 적응하는 데 특별히 사용됩니다. 4xx.html 또는 5xx.html 페이지. 🎜🎜(3) basicErrorController가 갈 페이지 주소는 오류 보기 파서 ErrorViewResolver에 의해 결정됩니다. 즉, 4xx.html에 적응됩니다. code> 또는 <code>5xx.html 페이지. 🎜

위 내용은 SpringBoot 예외 처리 원칙 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제