コントローラー内での例外処理

コントローラー内での例外はデフォルトではHandleErrorアトリビュートで処理する

  • コントローラー内での例外処理は、Exception filterアトリビュート(のOnException()メソッド)で処理する。
  • デフォルトのException fileterは、HandleErrorAttributeで、App_start()で"filters.Add(new HandleErrorAttribute())"で登録してある。

HandleErrorアトリビュートはコントローラーでエラーが発生するとViews\Shared\Error.cshtmlを呼ぶ

Views\Shared\Error.cshtml

 @model System.Web.Mvc.HandleErrorInfo
 <h1 class="text-danger">エラー</h1>
 <h2 class="text-danger">要求の処理中にエラーが発生しました。</h2>
 
 <dl>
    <dt>Controller</dt>
    <dd>@Model.ControllerName </dd>
    <dt>Action</dt>
    <dd>@Model.ActionName</dd>
    <dt>例外</dt>
    <dd>
        <pre>@Model.Exception</pre>
    </dd>
 </dl>

HandleErrorアトリビュートはWeb.cofingで<customErrors>のmodeがOnの時だけ機能する

Web.config

 <system.web>
   <customErrors mode="On"></customErrors>
 </system.web>

コントローラー内でOnException()を自作してOverrideする

 protected override void OnException(ExceptionContext filterContext)
 {
     if (filterContext.HttpContext.IsCustomErrorEnabled) {
         var vr = new ViewResult();
         vr.ViewName = "~/Views/Shared/MyError.cshtml";
         vr.ViewBag.ControllerName = (string) filterContext.RouteData.Values["controller"];
         vr.ViewBag.ActionName     = (string) filterContext.RouteData.Values["action"];
         vr.ViewBag.Exception      = filterContext.Exception.ToString();
 
         filterContext.Result = vr;
 
         filterContext.ExceptionHandled = true;
     }
 }
  • 上のようなOnException()メソッドを各コントローラークラスに記述する。
  • もしくは、一括で処理する場合、各コントローラークラスが継承する基底コントローラークラスを作り、その基底クラスで上のメソッドを記述する。

コントローラー外でのエラーを例外処理する場合はApplication_Errorを使う

global.asax.csにApplication_Error()を作成する。

HandleErrorの制約

  1. Not support to log the exceptions
  2. Doesn't catch HTTP exceptions other than 500
  3. Doesn't catch exceptions that are raised outside controllers
  4. Returns error view even for exceptions raised in AJAX calls

参考


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS