Heim >Java >javaLernprogramm >Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

WBOY
WBOYnach vorne
2023-05-13 23:28:131280Durchsuche

Ausnahmebehandlungsprozess

Führen Sie die Zielmethode aus. Jede Ausnahme während der Ausführung der Zielmethode wird von catch erfasst und markiert das Ende der aktuellen Anforderung eine Ausnahmecatch捕获,并标志当前请求结束,dispatchException抛出异常

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

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

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

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

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

几种异常处理方式及原理

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

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

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

Prinzipielle Analyse der SpringBoot-Ausnahmebehandlung🎜🎜Betreten Sie die Ansicht Parsing-Prozess und Rendern der Seite. Wenn eine Ausnahme auftritt, ist der Parameter mv leer und die erfasste Ausnahme dispatchException🎜🎜Prinzipielle Analyse der SpringBoot-Ausnahmebehandlung🎜🎜Behandeln Sie die Ausnahme, die im handler auftritt, und geben Sie ModelAndView nach Abschluss der Verarbeitung🎜🎜 Prinzipielle Analyse der SpringBoot-Ausnahmebehandlung 🎜🎜 (1) Durchlaufen Sie alle HandlerExceptionResolvers und suchen Sie den Resolver, der die aktuelle Ausnahme verarbeiten kann, um die Ausnahme aufzulösen🎜🎜Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung🎜🎜(2) Rufen Sie resolveException auf, um die Ausnahme aufzulösen, und übergeben Sie request- und response-Objekte, bei welcher Methode die Ausnahme auftritt, und dann gibt die benutzerdefinierte Ausnahmebehandlung ModelAndView zurück 🎜🎜Prinzipielle Analyse der SpringBoot-Ausnahmebehandlung🎜🎜① DefaultErrorAttributes Behandeln Sie zuerst die Ausnahme , speichern Sie die Ausnahmeinformationen im Feld request und geben Sie null zurück 🎜🎜Prinzipielle Analyse der SpringBoot-Ausnahmebehandlung🎜🎜② ExceptionHandlerExceptionResolver wird zur Behandlung von Methodenausnahmen verwendet, die mit @ExceptionHandler 🎜🎜③ annotiert sind ResponseStatusExceptionResolver wird zum Behandeln von Ausnahmen verwendet, die mit der annotierten Methodenausnahme @ ResponseStatus annotiert sind (4) Wenn kein Parser die Ausnahme verarbeiten kann, wird die Ausnahme ausgelöst 🎜🎜Prinzip Analyse der SpringBoot-Ausnahmebehandlung🎜🎜 (5) Wenn kein Parser die aktuelle Ausnahme verarbeiten kann, wird schließlich eine /error-Anfrage gesendet, die die gespeicherten Ausnahmeinformationen an /error. <code>BasicErrorController wird speziell zur Verarbeitung von /error-Anfragen verwendet. BasicErrorController durchläuft alle ErrorViewResolver, um Fehleransichten zu analysieren ist keine Anpassung. Der Fehleransicht-Resolver verwendet den Standard-DefaultErrorViewResolver, der den Antwortcode als Adresse der Fehlerseite verwendet, und die Vorlagen-Engine antwortet schließlich auf diese Seite. 🎜

Mehrere Methoden und Prinzipien zur Ausnahmebehandlung🎜🎜1 Angepasste Fehlerseite, error/404.html, error/5xx.html code> . Wenn eine genaue Fehlerstatus-Codeseite vorhanden ist, wird diese genau abgeglichen. Wenn keine Seite vorhanden ist, wird eine weiße Seite ausgelöst <code>@ControllerAdvice und @ExceptionHandler behandeln globale Ausnahmen. Die unterste Ebene wird von ExceptionHandlerExceptionResolver🎜🎜Prinzipielle Analyse der SpringBoot-Ausnahmebehandlung🎜🎜3. Verwenden Sie @ResponseStatus und benutzerdefinierte Ausnahmen. Die unterste Ebene ist ResponseStatusExceptionResolver. Die unterste Ebene ruft response.sendError(statusCode, gelöstReason) auf und Tomcat erhält einen Fehler. Am Ende der Anfrage gibt new ein leeres ModelAndView zurück, sodass kein Verarbeitungsparser die aktuelle Ausnahme und die /error-Anfrage verarbeiten kann wird schließlich gesendet. BasicErrorController wird speziell zur Verarbeitung von /error-Anfragen und zur Anpassung an 4xx.html oder 5xx.html verwendet. Code> Seiten🎜🎜<img src="https://img.php.cn/upload/article/000/887/227/168399169618365.png" alt="Prinzipielle Analyse der SpringBoot-Ausnahmebehandlung"><br> 🎜🎜4. Spring zugrunde liegende Ausnahmen, z. B. Ausnahmen bei der Parametertypkonvertierung. Die unterste Ebene ist <code>DefaultHandlerExceptionResolver, die Ausnahmen am unteren Rand des Frameworks behandelt. Die unterste Ebene ist auch response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE) Fehler. Am Ende der Anfrage gibt new ein leeres ModelAndView zurück, sodass kein Verarbeitungsparser die aktuelle Ausnahme und die /error-Anfrage verarbeiten kann wird schließlich gesendet. BasicErrorController wird speziell zur Verarbeitung von /error-Anfragen und zur Anpassung an 4xx.html oder 5xx.html verwendet. Code> Seiten🎜<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. Die benutzerdefinierte Implementierung von <code>HandlerExceptionResolver behandelt Ausnahmen und kann als standardmäßige globale Ausnahmebehandlungsregel verwendet werdenHandlerExceptionResolver 处理异常,可以作为默认的全局异常处理规则

@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();
    }
}

Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung

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

Prinzipielle Analyse der SpringBoot-Ausnahmebehandlung🎜🎜ErrorViewResolver implementiert eine benutzerdefinierte Ausnahmebehandlung. 🎜🎜(1) Wenn die unterste Ebene response.sendError aufruft, wird die error-Anfrage standardmäßig an basicErrorController weitergeleitet, BasicErrorController Wird speziell zur Bearbeitung von /Fehler-Anfragen und zur Anpassung an 4xx.html- oder 5xx.html-Seiten verwendet 🎜🎜 (2) Falls vorhanden Eine Ausnahme ist, dass kein Parser die Verarbeitung durchführen kann. Die untere Tomcat-Ebene ruft auch response.sendError auf. error-Anfragen werden standardmäßig an basicErrorController weitergeleitet. BasicErrorController wird speziell zur Bearbeitung von /error-Anfragen und zur Anpassung verwendet 4xx.html oder 5xx.html Seite. 🎜🎜(3) Die Seitenadresse, zu der basicErrorController geht, wird durch den Fehleransichtsparser ErrorViewResolver bestimmt, d. h. sie passt sich an 4xx.html an. code> oder <code>5xx.html Seite. 🎜

Das obige ist der detaillierte Inhalt vonAnalyse der Prinzipien der SpringBoot-Ausnahmebehandlung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen