- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- dotNet-ASP.NET MVC/例外処理/コントローラーのOnException()メソッド へ行く。
- 1 (2014-03-29 (土) 21:28:40)
- 2 (2014-03-29 (土) 21:30:13)
- 3 (2014-03-30 (日) 06:57:29)
コントローラー内での例外処理
コントローラー内での例外はデフォルトでは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の制約
- 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