9

すべての例外を処理してログに記録するために、グローバル アクション フィルターを使用しています。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new ElmahHandleErrorAttribute());
        filters.Add(new HandleErrorAttribute());
    }

これがグローバル アクション フィルタのElmahHandleErrorAttribute定義方法です。メソッドをオーバーライドしますOnException

public class ElmahHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
       //Is the exception handled already? context.ExceptionHandled seems to be true here
        if (!context.IsChildAction && (context.HttpContext.IsCustomErrorEnabled))
        {
            //Do other stuff stuff
            //Log to Elmah               
        }
    }
   ...
 }

メソッドの実行context.ExceptionHandled時に の値が true になる理由がわかりません。OnExceptionこの例外はどのように処理されますか?

-EDIT-customErrorsセクションがありWeb.Configます。私にはErrorControllerクラスがあり、アクションは and と呼ばGeneralHttp404ます。

<customErrors mode ="On" defaultRedirect="Error/General">
      <error statusCode="404" redirect="Error/Http404"/>
  </customErrors>

私が理解していないのは、コントローラーのアクションGeneralは実行されません (ブレークポイントはヒットしません) が、メソッドの実行が開始されると、の値はExceptionContext.ExceptionHandledtrue に設定されます。OnExceptionElmahHandleErrorAttribute

4

1 に答える 1

24

例外が発生すると、グローバル フィルターの順序が逆の順序で実行されます。これは、HandleErrorAttributeが最初に実行されることを意味します。

HandleErrorAttribute hereのコードを表示できますが、要するに次のとおりです。

  1. ExceptionHandledが false の場合にのみ実行され、カスタム エラーが有効になっています。
  2. エラー ビューへのリダイレクトを設定します。デフォルトでは と呼ばれますError
  3. true に設定ExceptionHandledします。

これは最初のフィルターであるExceptionHandledため、実行時に false になり、ビューがエラーに設定ExceptionHandledされ、true に設定されます。したがって、独自のフィルターが実行されると、それExceptionHandledがすでに true に設定されている理由です。カスタム エラーが無効になっている場合は、その処理が行われないためExceptionHandled、まだ false になることに注意してください。HandleErrorAttributeこの場合、ELMAH は処理されないエラー (死の黄色い画面) であるため、とにかくエラーをログに記録します。そのため、クラスでのテストは、エラーの重複ログを防止することです。

ここで、Generalアクションが実行されない理由に関する他の質問に進みます。これは、フィルターが明示的なリダイレクト自体を設定していない場合にのみ使用されるため、ActionMethod 内で例外が発生し、グローバルフィルターが登録されdefaultRedirectている場合、実際には無視されます。HandleErrorAttribute. ただし、存在しない URL を入力した場合、つまり ActionMethod 内から発生しないエラーが発生した場合に呼び出されます。HandleErrorAttributeまた、 Global.asax.csに登録する行をコメント アウトすると、常にGeneralコントローラー アクションが実行されます。

于 2012-05-18T10:21:19.090 に答える