2

本番環境で発生する可能性のあるすべてのエラーが適切にログに記録されることが非常に重要な MVC3 アプリケーションがあります。

現在のアプローチでは IExceptionFilter.OnException を使用しています。この機能は、他のすべてのコントローラーが継承する BaseContorller に適用され、次のように見えます (少し簡略化されています)。

public class BaseController : Controller, IExceptionFilter
{        
    protected override void OnException(ExceptionContext exceptionContext)
    {
        Logger.Error(exceptionContext.Exception);
    }
}

このアプローチは、次の場合に非常にうまく機能します。

  • コントローラー アクション メソッド内のコードで発生する例外

  • コンパイル エラーを含む、コントローラ メソッドによって返されたビューに起因する例外

  • コントローラーに適用されるフィルターの例外

ただし、このアプローチを使用してもキャッチされない例外があります。

  • コントローラー コンストラクター内でスローされる例外
  • 次のようなアプリケーション ルーチンでスローされる例外: RegisterGlobalFilters、RegisterRoutes、Application_Start
  • ページが見つかりません (404)

コントローラー レベルの例外処理で見逃す可能性があると考えられる他の種類の例外はありますか?

Application_Error または ELMAH を使用してロギングの追加レイヤーを実装する可能性が高く、これらの例外がログに記録されずにすり抜けないことを確認したいので、質問しています。

4

1 に答える 1

2

MVC パイプラインを通過しないものは、この実装ではキャッチされません。HttpHandlers、WebAPI の実装、ServiceStack の追加など。

エルマーを追加しても害はありませんが、おそらくどちらかを選択するだけです. エラー処理を断片化すると、デバッグ時に作業が倍増する可能性があります。

「私のロガーが捕まえたのですか、それともエルマが捕まえたのですか?」

Elmah は ASP.NET メタルに近いので、Elmah に固執し、例外を 1 か所にまとめておきます。

 NuGet Install-Package Elmah.MVC

補足として、ロガーにトレースを実行させたい場合もありますが、それは未処理の例外よりもコードでより明示的に表現されています。

 Logger.Info("Just got another Sale, W00t!")
于 2013-01-28T15:33:03.150 に答える