- 追加された行はこの色です。
- 削除された行はこの色です。
* コントローラー内でのエラー処理 [#pea54169]
* コントローラー内での例外処理 [#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