Maison >Java >javaDidacticiel >Analyse des principes de gestion des exceptions SpringBoot
Exécuter la méthode cible. Toute exception lors de l'exécution de la méthode cible sera capturée par catch
et marquera la fin de la requête en cours, dispatchException code>Lancer une exception<code>catch
捕获,并标志当前请求结束,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
est vide et l'exception capturée dispatchException est transmis. #🎜🎜##🎜🎜## 🎜🎜##🎜🎜# Gère l'exception qui se produit dans handler
et renvoie ModelAndView
une fois le traitement terminé #🎜🎜 ##🎜🎜##🎜🎜# #🎜🎜# (1) Parcourez tous les HandlerExceptionResolvers code>, trouvez un analyseur capable de gérer l'exception actuelle pour analyser l'exception #🎜🎜##🎜🎜#<img src="https://img.%20php.cn/upload/article/000/887/227/168399169511466.png%20" alt="Analyse des principes de la gestion des exceptions SpringBoot">#🎜🎜##🎜🎜# (2) Appelez <code>resolveException
pour résoudre l'exception, en transmettant l'objet request
et réponse
, quelle méthode l'exception s'est produite, puis personnalisez la gestion des exceptions pour renvoyer ModelAndView
# 🎜🎜##🎜🎜##🎜 🎜##🎜🎜# (3) Analyseur d'exceptions par défaut du système#🎜🎜##🎜 🎜##🎜🎜##🎜🎜 #① DefaultErrorAttributes
Gérez d'abord l'exception, enregistrez les informations sur l'exception dans le champ request
et return null
#🎜🎜##🎜🎜##🎜🎜##🎜🎜#② ExceptionHandlerExceptionResolver
est utilisé pour gérer les exceptions de méthode annotées avec @ExceptionHandler
#🎜🎜##🎜🎜# ③ ResponseStatusExceptionResolver
est utilisé pour gérer les exceptions annotées avec @ResponseStatus
Exception de méthode annotée #🎜🎜##🎜🎜#④ DefaultHandlerExceptionResolver
Analyseur d'exceptions de processeur par défaut, gère certaines exceptions courantes #🎜🎜##🎜🎜# (4) Si aucun analyseur ne peut gérer l'exception, et l'exception sera levée alt="Analyse des principes de la gestion des exceptions SpringBoot" />#🎜🎜##🎜🎜# ( 5) Si aucun analyseur ne peut gérer l'exception actuelle, la requête /error
sera finalement envoyée et sera enregistrée. Les informations sur l'exception sont transmises à /error
. BasicErrorController
est spécialement utilisé pour gérer les requêtes /error
BasicErrorController
parcourira tous les ErrorViewResolver
pour analyser les vues d'erreur s'il y en a. Il n'y a pas de personnalisation. Le résolveur de vue d'erreur utilisera le DefaultErrorViewResolver
par défaut, qui utilisera le code de réponse comme adresse de la page d'erreur, et le moteur de modèle finira par répondre à cette page. #🎜🎜#error/404.html
, . erreur/5xx.html4xx.html
. S'il n'y en a pas, une page blanche sera déclenchée. ##🎜🎜#2. Utilisez @ControllerAdvice code> et <code>@ExceptionHandler
pour gérer les exceptions globales, et la couche inférieure est prise en charge par ExceptionHandlerExceptionResolver
#🎜🎜#. #🎜🎜##🎜🎜## 🎜🎜#3. Utilisez @ResponseStatus
et personnalisez anormal. La couche inférieure est ResponseStatusExceptionResolver
. La couche inférieure appelle response.sendError(statusCode, wantedReason)
et Tomcat recevra une erreur
. A la fin de la requête, new
renvoie un ModelAndView
vide, afin qu'aucun analyseur de traitement ne puisse gérer l'exception actuelle, et la requête /error
sera finalement envoyé. BasicErrorController
est spécialement utilisé pour gérer les requêtes /error
et s'adapter à 4xx.html
ou 5xx.html code> pages#🎜🎜# #🎜🎜#<img src="https://img.php.cn/upload/article/000/887/227/168399169618365.png" alt="Analyse des principes de la gestion des exceptions SpringBoot"><br># 🎜🎜##🎜🎜#4. Exceptions sous-jacentes de Spring, telles que les exceptions de conversion de type de paramètre. La couche inférieure est <code>DefaultHandlerExceptionResolver
qui gère les exceptions au bas du framework. La couche inférieure est également response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE)
. erreur. A la fin de la requête, new
renvoie un ModelAndView
vide, afin qu'aucun analyseur de traitement ne puisse gérer l'exception actuelle, et la requête /error
sera finalement envoyé. BasicErrorController
est spécialement utilisé pour gérer les requêtes /error
et s'adapter à 4xx.html
ou 5xx.html code>pages#🎜🎜#<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. L'implémentation personnalisée de <code>HandlerExceptionResolver
gère les exceptions et peut être utilisée comme règle globale de gestion des exceptions par défautHandlerExceptionResolver
处理异常,可以作为默认的全局异常处理规则
@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
implémente une gestion personnalisée des exceptions. 🎜🎜(1) Lorsque la couche inférieure appelle response.sendError
, la requête error
sera transmise à basicErrorController
par défaut, BasicErrorController
Spécialement utilisé pour gérer les requêtes /error
et s'adapter aux pages 4xx.html
ou 5xx.html
🎜🎜 (2) S'il y a est une exception, aucun analyseur ne peut traiter, la couche inférieure de Tomcat appellera également response.sendError
. Les requêtes error
seront transmises à basicErrorController
par défaut. BasicErrorController
est spécialement utilisé pour gérer les requêtes /error
et s'y adapter. Page 4xx.html
ou 5xx.html
. 🎜🎜(3) L'adresse de la page à laquelle basicErrorController
va est déterminée par l'analyseur de vue d'erreur ErrorViewResolver
, c'est-à-dire qu'elle s'adapte à 4xx.html code> ou <code>5xx.html
. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!