ターゲット メソッドを実行します。ターゲット メソッドの実行中の例外はすべて、catch
によってキャッチされ、現在のリクエストの終了がマークされます。 は例外をスローします
mv は空になり、キャプチャされた例外
dispatchException## が渡されます。
で発生した例外を処理し、ModelAndView
を返します。
(1) すべての
HandlerExceptionResolvers を調べて、現在の例外を処理できるパーサーを見つけて例外を解決します
(2)
solveExceptionを呼び出して例外を解決し、request
オブジェクトと response
オブジェクト、どのメソッドで例外が発生したかを渡します。 ModelAndView
(3) システムのデフォルトの例外パーサー
を返すように例外処理をカスタマイズします。 ①
DefaultErrorAttributes最初に例外を処理し、情報は request
フィールドに保存され、null
# が返されます。 ② ExceptionHandlerExceptionResolver
はアノテーションの処理に使用されます@ExceptionHandlerアノテーション付きメソッド例外
③
ResponseStatusExceptionResolver
@ResponseStatus アノテーション付きメソッド例外の処理に使用されます④
DefaultHandlerExceptionResolver
(4) 例外を処理できるパーサーがない場合、例外がスローされます
(5) 現在の例外を処理できるパーサーがない場合、最終的に /error
リクエストが送信され、保存された例外情報が/ に転送されます。エラー###。 BasicErrorController
は、/error
リクエストを処理するために特別に使用されます。BasicErrorController
は、すべての ErrorViewResolver
を走査してエラー ビューを解析します。カスタム エラーがない場合ビューの解析 デフォルトの DefaultErrorViewResolver
が使用され、応答コードがエラー ページのアドレスとして使用され、テンプレート エンジンは最終的にこのページに応答します。 いくつかの例外処理方法と原則
1. エラー ページ
をカスタマイズします。正確なエラー ステータス コード ページがある場合は、正確に照合されます。ページがない場合は、4xx.html
を探します。ページがない場合は、白いページがトリガーされます。
2. @ControllerAdvice
と
を使用してグローバル例外を処理し、最下層は ExceptionHandlerExceptionResolver
# によってサポートされます。
#3.
と自己定義の例外を使用します。最下層は ResponseStatusExceptionResolver
で、最下層はresponse.sendError(statusCode,solvedReason) を呼び出し、Tomcat は
error を受け取ります。リクエストの最後に空の
ModelAndView が返されるため、処理パーサーは現在の例外を処理できず、最終的に
/error リクエストが送信されます (
BasicErrorController)。 は、
/error リクエストを処理し、
4xx.html または
5xx.html ページ
# に適応するために特別に使用されます。
##4. Spring の基礎となる例外 (パラメーター型変換例外など)。最下層は、フレームワークの最下部で例外を処理する
DefaultHandlerExceptionResolver
です。最下層は
です。Tomcat は error# を受け取ります##。リクエストの最後に空の
ModelAndView
/error リクエストが送信されます (
BasicErrorController)。 は、
/error リクエストを処理するために特別に使用され、
4xx.html または
5xx.html page
に適応します。
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; }
5.自訂實作 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(); } }
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
頁。
以上がSpringBoot 例外処理の原理の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。