Heim >Java >javaLernprogramm >Analyse der Prinzipien der SpringBoot-Ausnahmebehandlung
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
抛出异常
进入视图解析流程,并渲染页面,发生异常时,参数mv
为空,传入捕获的异常dispatchException
处理handler
发生的异常,处理完成返回ModelAndView
(1)遍历所有的HandlerExceptionResolvers
,找到可以处理当前异常的解析器来解析异常
(2)调用resolveException
解析异常,传入request
和response
对象,哪个方法,发生的异常,然后自定义异常处理返回ModelAndView
(3)系统默认的异常解析器
① DefaultErrorAttributes
先来处理异常,把异常信息保存到request
域并返回null
② ExceptionHandlerExceptionResolver
用来处理标注了@ExceptionHandler
注解的方法异常
③ ResponseStatusExceptionResolver
用来处理标注了@ResponseStatus
注解的方法异常
④ DefaultHandlerExceptionResolver
默认的处理器异常解析器,处理一些常见的异常
(4)如果没有任何解析器能够处理异常,异常就会抛出
(5)如果没有任何解析器能够处理当前异常,最终就会发送/error
请求,将保存的异常信息转发到/error
。BasicErrorController
专门来处理/error
请求,BasicErrorController
会遍历所有的ErrorViewResolver
解析错误视图,如果没有自定义的错误视图解析器,就会使用默认的DefaultErrorViewResolver
,会把响应码作为错误页的地址,模板引擎最终响应这个页面。
1.自定义错误页,error/404.html
、error/5xx.html
。有精确的错误状态码页面就匹配精确,没有就找 4xx.html
,如果都没有就触发白页
2.使用@ControllerAdvice
和@ExceptionHandler
处理全局异常,底层是ExceptionHandlerExceptionResolver
支持的
3.使用@ResponseStatus
和自定义异常。底层是 ResponseStatusExceptionResolver
,底层调用 response.sendError(statusCode, resolvedReason)
,Tomcat会收到一个error
。请求最后new
一个空的ModelAndView
返回,这样任何处理解析器都处理不了当前的异常,最终就会发送/error
请求,BasicErrorController
专门来处理/error
请求,适配4xx.html
或者5xx.html
页面
4.Spring底层的异常,如参数类型转换异常。底层是DefaultHandlerExceptionResolver
处理框架底层的异常,底层也是response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE)
,Tomcat会收到一个error
。请求最后new
一个空的ModelAndView
返回,这样任何处理解析器都处理不了当前的异常,最终就会发送/error
请求,BasicErrorController
专门来处理/error
请求,适配4xx.html
或者5xx.html
mv
leer und die erfasste Ausnahme dispatchException
🎜🎜🎜🎜Behandeln Sie die Ausnahme, die im handler
auftritt, und geben Sie ModelAndView
nach Abschluss der Verarbeitung🎜🎜 🎜🎜 (1) Durchlaufen Sie alle HandlerExceptionResolvers und suchen Sie den Resolver, der die aktuelle Ausnahme verarbeiten kann, um die Ausnahme aufzulösen🎜🎜🎜🎜(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 🎜🎜🎜🎜① DefaultErrorAttributes
Behandeln Sie zuerst die Ausnahme , speichern Sie die Ausnahmeinformationen im Feld request
und geben Sie null
zurück 🎜🎜🎜🎜② 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 🎜🎜🎜🎜 (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. 🎜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
🎜🎜🎜🎜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("Failure while trying to resolve exception [" + ex.getClass().getName() + "]", 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(); } }
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
或者5xx.html
rrreee
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!