私のSpring MVCアプリは、次のようなメソッドでいっぱいです。
@RequestMapping(value = "/foo", method = RequestMethod.GET)
public final void foo(HttpServletRequest request, ModelMap modelMap){
try{
this.fooService.foo();
}
catch (Exception e){
log.warn(e.getMessage(), e);
}
}
例外はキャッチされてログに記録されますが、それ以外では処理されません。
上記でfooService
呼び出されたものは同じことを行い、例外をコントローラーにスローすることはありませんが、それらをキャッチしてログに記録します。したがって、実際にはこのコントローラー例外コードは呼び出されません。
アプリに適切な例外処理を実装するための最善かつ最も簡単なアプローチは何ですか?
catch
不注意にログを記録するだけの場合は、すべてのステートメントを削除します。catch
エラーを非表示にするのではなく、処理するためのものです。
これらすべての漁獲量が削除されると、Spring MVCの中で一つのグローバル例外リゾルバをインストールする(1、2、3、...)だけで、この些細なインターフェイスを実装します。
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}
例外リゾルバーでは、単に例外をログに記録して、それを未処理(return null
)にしておくことweb.xml
ができます。これにより、のエラーマッピングが要求を適切なエラーページに転送します。または、自分で例外を処理し、エラーページをレンダリングすることもできます。最も単純なケースでは、登録例外リゾルバは必要ありません@Service
。それをSpring Beanとして定義し、/で注釈を付けます。
どうすればよいかわかっている場合にのみ、例外をキャッチしてください。ロギングはトラブルシューティングのみを目的としており、何も処理しません。
ところでこれ:
log.warn(e.getMessage(), e);
は例外処理が非常に貧弱であるだけでなく、少し間違っています。例外にメッセージがない場合null
、スタックトレースの直前に不思議なメッセージが表示されます。含まれている場合、メッセージは2回表示されます(Logbackでテスト済み)。
22:51:23.985 WARN [main][Foo] OMG! - this is the exception message
java.lang.IllegalStateException: OMG! - this is the exception message
at Foo.bar(Foo.java:20) ~[test-classes/:na]
...特に例外メッセージが非常に長い場合は、望ましくない場合があります。
更新:独自の例外ロガーを作成する場合は、org.springframework.web.servlet.HandlerExceptionResolver
およびの両方の実装を検討してくださいorg.springframework.core.Ordered
。getOrder()
(のような小さなものを返す必要があり0
、あなたのハンドラは組み込みのハンドラよりも優先されるように)。
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
ハンドラーの前に実行すると、例外をログに記録せずにHTTP 500が返されただけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加