* コントローラー内での例外処理 [#pea54169]

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

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


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

*** Views\Shared\Error.cshtml [#b379c161]
 @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の時だけ機能する [#u2789192]

*** Web.config [#kae426e5]
 <system.web>
   <customErrors mode="On"></customErrors>
 </system.web>

** コントローラー内でOnException()を自作してOverrideする [#q73ee7fe]
 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を使う [#a967f90b]
global.asax.csにApplication_Error()を作成する。

** HandleErrorの制約 [#sec836e9]
+ Not support to log the exceptions 
+ Doesn't catch HTTP exceptions other than 500 
+ Doesn't catch exceptions that are raised outside controllers 
+ Returns error view even for exceptions raised in AJAX calls 

** 参考 [#c7c6ee0e]
- http://prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc
- http://stackoverflow.com/questions/10354833/advantages-of-handleerror-over-application-error
- http://miso-soup3.hateblo.jp/entry/20120926/1348657714


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