コントローラのOnException
メソッドは、リクエストの処理中に未処理の例外が発生した場合に使用されます。予期しない例外が発生した場合にどのような機能が発生するかを示します。これは、混乱した場合や、システムに予期しない致命的な方法で障害が発生した場合の安全策としてのみ使用する必要があります。
特定の例外をスローすることが予想されるコードを実行している場合は、それをtry
ブロックでラップし、それに応じて特定の例外を処理します。この防御的なアプローチは、問題が発生するとすぐにデバッグするのに役立ちます。原因がわからなくなるまで問題が発生するのを待つのではありません。
複数のアクションメソッドがあり、OnException
コントローラーごとに1つのメソッドしかない場合は、アクションメソッドまたはフィルターのいずれかがエラーをスローする可能性があるため、処理するのがはるかに複雑な問題になります。ただし、特定のサービスコールによって呼び出された例外をキャッチした場合は、予期しない動作の原因をすでに正確に把握しているため、それに応じて対処する方がはるかに簡単です。
理解を深めるためにこれを読んでください。EricLippertは、私たちが遭遇するさまざまなカテゴリの例外を分類し、それらに対処するためのベストプラクティスを提供する優れた記事を持っています。http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspxで入手できます。Eric Lippertが誰であるかわからない場合は、彼は非常に賢いので、C#でコーディングする場合は彼の話を聞く必要があります。彼の主なポイントは次のとおりです。
致命的な例外をキャッチしないでください。とにかくそれらについてあなたができることは何もありません、そして一般的にそれを悪化させようとします。
骨の折れる例外がトリガーされないようにコードを修正します。「インデックスが範囲外」の例外が本番コードで発生しないようにします。
例外的でない状況でスローする厄介なメソッドの「Try」バージョンを呼び出すことにより、可能な限り厄介な例外を回避します。厄介なメソッドの呼び出しを避けられない場合は、その厄介な例外をキャッチします。
予期しない外因性の状態を示す例外を常に処理します。一般に、考えられるすべての障害を予測することは価値がなく、実用的でもありません。操作を試して、例外を処理する準備をしてください。
アップデート
「ロギング」の質問に明示的に対処しなかったことに気づきました。多くの場合、ロジックが重複することになるため、コントローラースコープで致命的/外因性のエラーを処理しないようにするのが最も理にかなっています。この動作は、グローバルアクションフィルターでより適切に処理されます。
このcodeprojectの記事ASP.NETMVCでの例外処理では、デフォルトをオーバーライドして、グローバルに適用できるようにをHandleErrorAttribute
活用する方法について説明しています。ErrorController
さらに、次の5部構成のブログシリーズでは、MVCアプリケーションでのエラー処理に使用できるさまざまなオプションの詳細な分析を提供しています。http: //perspectivespace.com/error-handling-in-aspnet-mvc-3-index- of-posts