- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 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