おじさんの手記(6):ASPを巧みに使う.NetMVC 3のHandleErrorAttribute

8577 ワード

前言


チームの人々に「Good programming is good Error Handling」を強調してきたが、YSOD(Yellow Screen of Death)が好きな人はいなかった.私は黄色いページを見るたびに驚きました.特にお客様にプレゼンテーションをするときです.だから、いつでも黄色いページがあなたが開発したコードによるものであれば、申し訳ありません.私はあなたの業績に低い点数をつけます.もちろん、黄色いページもありますが、特別な場合は本当に予知できないかもしれませんが、端末ユーザーにこのYSODページが見えないようにするには、少なくともいくつかのテクニックが必要です.

イニシアチブ


幸いなことに、MVC 3には既存の機能サポートがあります.これはHandleErrorAttribteクラスです.2つの方法で使用できます.1つは、クラスまたはメソッドでHandleError属性を直接使用して定義することです.
//      
[HandleError]
public class HomeController : Controller
{
//
// [HandleError]
public ActionResult Index()
{
return View();
}
}

もう1つの方法は、MVC 3のGlobal Filters機能を使用する登録である、デフォルトで新規MVC項目がGlobalにある.asaxファイルにはすでにあります.コードは次のとおりです.
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

}

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}

コードセグメントのfilters.Add(new HandleErrorAttribute());プログラム全体のすべてのコントローラがこのHandleErrorAttributeを使用してエラーを処理するように設定されています.注意:HandleErrorAttributeは500シリーズのエラーのみを処理するため、404エラーは別途処理する必要があります.後述します.次はwebを開くことですconfigルートディレクトリのcustomErrors(viewsディレクトリの下のweb.configではありませんよ)、コードは以下の通りです.
<customerrors mode="On" defaultredirect="~/Error/HttpError">
<error redirect="~/Error/NotFound" statuscode="404" />
</customerrors>

defaultredirectは、すべてのエラーページが転向するように設定されたエラーページアドレスであり、中のerror要素は、404に対応するページアドレスを定義する異なるエラーページ転向アドレスを個別に定義することができる.最後に、必要なエラーページを定義するErrorControllerです.
public class ErrorController : BaseController
{
//
// GET: /Error/
public ActionResult HttpError()
{
return View("Error");
}
public ActionResult NotFound()
{
return View();
}
public ActionResult Index()
{
return RedirectToAction("Index", "Home");
}
}

デフォルトのErrorのviewは/views/shared/Errorです.cshtmlファイル、このviewのコードを書き直します.コードは以下の通りです.
@model System.Web.Mvc.HandleErrorInfo
@{
ViewBag.Title = "General Site Error";
}

<h2>A General Error Has Occurred</h2>

@if (Model != null)
{
<p>@Model.Exception.GetType().Name<br />
thrown in @Model.ControllerName @Model.ActionName</p>
<p>Error Details:</p>
<p>@Model.Exception.Message</p>
}

パラメータを渡すことでGlobalFilterのHandleErrorAttribte登録を書き換えることもでき、特定のExceptionを単独で宣言し、Orderパラメータを持つこともできます.もちろん、複数を連続的に宣言することもできます.これにより、複数回処理されます.
filters.Add(new HandleErrorAttribute
{
ExceptionType = typeof(YourExceptionHere),
// DbError.cshtml Shared view.
View = "DbError",
Order = 2
});

同期と終了語


この文書はディレクトリインデックスに同期されました:『おじさん手記全集』
おじさんの手記:日常の仕事の中の各種の小さい技巧と資料(技術に限らないことを含むが)を記録することを目的として、もしあなたに役に立つならば、お勧めして、おじさんに書く動力にあげてください