* HandleErrorフィルター [#b766827c]
* HandleErrorアトリビュート [#b766827c]
** HandleErrorアトリビュートとは? [#a56ca50e]
- HandleErrorアトリビュートはコントローラー内のアクションメソッドで発生する例外をキャッチするのに使われる。
- HandleErrorアトリビュートはデフォルトでGlobalFilterに追加されている。
-- MVC3: Glaobal.asax
-- MVC4: App_Statr/FilterConfig.cs: filters.Add(new HandleErrorAttribute()
- HandleErrorは、Web.configでcustomErrors mode="On" の場合だけ例外をハンドル出来る。
*** 補足:ExceptionFilterアトリビュートとHandleErrorアトリビュート [#ee829850]
- コントローラー内で例外した例外はException filterアトリビュートのOnException()メソッドで処理される。
- デフォルトのException filterがHandleError。
** HandleErrorフィルターの使用例 [#qdf04099]
*** コントローラー [#z4334a70]
[HandleError]
public ActionResult Index()
{
throw new Exception("HandleError Exception");
return View();
}
*** Web.config [#uc1a201a]
<system.web
<customErrors mode="On"></customErrors>
</system.web
*** 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>
** エラーページを表示せずにエラーURLへHTTPリダイレクトさせる [#l56441a9]
*** Web.config [#c69e457e]
<customErrors mode="On" defaultRedirect="~/Error/Index" redirectMode="ResponseRedirect">
<error statusCode="403" redirect="~/Error/Forbidden" /
</customErrors>
*** エラーコントローラー Controllers\ErrorController.cs [#c96a2cb5]
public class ErrorController : BaseController
{
public ActionResult Index()
{
return View();
}
public ActionResult Http403()
{
Response.StatusCode = 403;
return Content("Forbidden:403", "text/plain");
}
}
*** エラーテンプレート Views\Error\Index.cshtml [#hadb9374]
(略)
** 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
** 参考 [#m27796a8]
- http://prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc
- http://www.dotnetexpertguide.com/2013/05/aspnet-mvc-handleerror-action-filter.html
- http://stackoverflow.com/questions/183316/asp-net-mvc-handleerror