私が使用していたMVC3Webアプリケーションで
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
未処理の例外が発生した場合にユーザーに「エラー」ビューが表示されるグローバルエラー処理を適用します。
ある特定のビューでは、メソッドを。で修飾することによって未処理の例外が発生した場合に、別のエラービューを表示することも必要 [HandleError(View = "SpecialError")]
でした。これはうまくいきました。
次に、未処理の例外のグローバルロギングを追加したいと思いました。ロギングコードを使用してカスタムHandleError属性を作成しました。
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Write to log code
base.OnException(context);
}
}
また、RegisterGlobalFiltersとメソッドの装飾を更新して、代わりにこの属性名を使用するようにしました。MyHandleError(View = "SpecialError")]
これは一般的に機能しますが、OnExceptionメソッドで装飾されたメソッド内で例外が発生すると、 2回呼び出されます。もともと、この属性でメソッドを装飾することはグローバルハンドラーに取って代わったと思いましたが、それは単に追加されたようです(これはより理にかなっていますが、私が望むものではありません)。OnExceptionを2回呼び出すことにより、同じ例外が2回ログに記録されますが、これは発生してはなりません。OnExceptionはカスタム属性であるため、 2回呼び出されているとは思いません。これは、標準のHandleError属性でも発生すると思います。これは、レコードを作成しているときに表示されるだけです。
最終的には、[HandleError]によって提供される機能、特に特定のメソッド例外に異なるビューを設定しながら、すべての未処理の例外を(1回)ログに記録したいと思います。これを行うためのクリーンな方法はありますか?