Maison  >  Article  >  Java  >  Analyse des principes de gestion des exceptions SpringBoot

Analyse des principes de gestion des exceptions SpringBoot

WBOY
WBOYavant
2023-05-13 23:28:131250parcourir

Processus de gestion des exceptions

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抛出异常

Analyse des principes de gestion des exceptions SpringBoot

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

Analyse des principes de gestion des exceptions SpringBoot

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

Analyse des principes de gestion des exceptions SpringBoot

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

Analyse des principes de gestion des exceptions SpringBoot

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

Analyse des principes de gestion des exceptions SpringBoot

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

Analyse des principes de gestion des exceptions SpringBoot

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

Analyse des principes de gestion des exceptions SpringBoot

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

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

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

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

Analyse des principes de gestion des exceptions SpringBoot

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

几种异常处理方式及原理

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

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

Analyse des principes de gestion des exceptions SpringBoot

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

Analyse des principes de gestion des exceptions SpringBoot

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

 Le principe de la gestion des exceptions SpringBoot Analyse#🎜🎜##🎜🎜#Entrez dans le processus d'analyse de la vue et restituez la page. Lorsqu'une exception se produit, le paramètre mv est vide et l'exception capturée dispatchException est transmis. #🎜🎜##🎜🎜#Analyse des principes de la gestion des exceptions SpringBoot# 🎜🎜##🎜🎜# Gère l'exception qui se produit dans handler et renvoie ModelAndView une fois le traitement terminé #🎜🎜 ##🎜🎜#Analyse des principes de la gestion des exceptions SpringBoot#🎜🎜# #🎜🎜# (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# 🎜🎜##🎜🎜#Analyse des principes de la gestion des exceptions SpringBoot#🎜 🎜##🎜🎜# (3) Analyseur d'exceptions par défaut du système#🎜🎜##🎜 🎜#Analyse des principes de la gestion des exceptions SpringBoot#🎜🎜##🎜🎜 #① DefaultErrorAttributes Gérez d'abord l'exception, enregistrez les informations sur l'exception dans le champ request et return null#🎜🎜##🎜🎜#Principe analyse de la gestion des exceptions SpringBoot#🎜🎜##🎜🎜#② 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 #🎜🎜##🎜🎜#④ DefaultHandlerExceptionResolverAnalyseur 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. #🎜🎜#

Plusieurs méthodes et principes de gestion des exceptions #🎜🎜##🎜🎜#1 Page d'erreur personnalisée, error/404.html, . erreur/5xx.html

. S'il existe une page de codes d'état d'erreur précise, elle sera mise en correspondance avec précision. S'il n'y a pas de page, recherchez 4xx.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#🎜🎜#. #🎜🎜#Analyse des principes de la gestion des exceptions SpringBoot#🎜🎜## 🎜🎜#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(&quot;Failure while trying to resolve exception [&quot; + ex.getClass().getName() + &quot;]&quot;, 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();
    }
}

Analyse des principes de gestion des exceptions 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

Analyse des principes de la gestion des exceptions SpringBoot🎜🎜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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer