MVC HandleErrorAttributeを使用したカスタム例外

14890 ワード

本文ガイド:ASP.NET MVCでは、Actionから放出する異常をどのように扱うかを、HandleErrorAttributeの特性を用いて具体的に指定することができる.あるアクションがHandleErrorAttributeの特性を設定限り、MVCは、そのアクションが異常を放出すると、~/Views/Sharedディレクトリの下にあるErrorビューを表示する.
 
MVCには、エラーをキャプチャできるFilterがありますが、その使い方はAttributeで実現されており、ControllerとActionにしか加算されないので、別のエラーはキャプチャできません
実は理論上のすべての誤りは必ずControllerの中で発生して、しかし2種類の情況があって、捉えられませんでした
1、ページが存在しない場合、対応するコントローラが見つからない場合は、コントローラが実行されることはありませんので、エラーをキャプチャすることはありません
2、IAuthorizationFilterでエラーが発生した場合、エラーキャプチャコードはIExceptionFilterにあり、IAuthorizationFilterの優先度はIExceptionFilterより高いため、キャプチャできない
 
一、HandleErrorの使用
1、HandleError属性の設定
次のプロパティを設定することで、HandleErrorAttributeプロパティのデフォルト処理を変更できます.
  ExceptionType.フィルタがその種類またはどの種類の異常を処理するかを指定し、その属性が指定されていない場合、フィルタはすべての異常を処理する.
  View.異常発生時にフィルタが表示するビュー名を指定します.
  Master.ビューマスターの名前を指定します.もしあれば.
  Order.1つのアクションに複数のHandleErrorAttributeフィルタがある場合、フィルタの適用順序を指定します.
 
2、Order属性の指定
あるアクションが複数のHandleErrorAttributeを設定場合、Order属性はどのフィルタを使用するかを決定するために使用することができる.値は、-1(最優先度)から任意の正の整数までの整数に設定、優先度を識別することができ、値が大きいほど優先度が低い.Orderプロパティは、次のルールに従います.
コントローラに適用するフィルタは、そのコントローラのすべてのアクションに自動的に適用される.
ControllerとActionの両方にHandleErrorAttributeが適用すると、Orderの属性値が同じである限り、Controller上のフィルタが先に実行する、Action上のフィルタが実行される.
同じOrder属性のフィルタについては、その実行順序が不定である.
Order属性が指定する場合、デフォルトは-1です.これは、他のフィルタが-1を指定しない限り、他のフィルタよりも優先的に実行することを意味します.
複数のフィルタが適用する場合、最初に異常を処理できるフィルタが最初に呼び出され、その後、異常に対する処理が終了する.
 
3、Viewで異常情報を取得する
  ASP.NET MVCフレームワークは、ExceptionContextクラスの一例であるErrorビューに異常情報を格納する.
ActionName:ターゲットアクションメソッドの名前
ControllerName:ターゲットControllerの名前
Exception:例外オブジェクト.
 
二、HandleErrorAttribte類を用いて異常及び手順を処理する
 
1、次の2つの方法で1つの処理異常を選択することができる
(1)、クラスまたはメソッドにHandleError属性を直接使用して定義する
 

       
         //      [HandleError] publicclass HomeController : Controller { //         // [HandleError]   public ActionResult Index() { return View(); } }

 
(2)、MVC 3のGlobal Filters機能を使用して登録する、デフォルトで新規MVC項目がGlobalにある.asaxファイルにはすでにあります
コードセグメントのfilters.Add(new HandleErrorAttribute());プログラム全体のすべてのコントローラがこのHandleErrorAttributeを使用してエラーを処理するように設定されています.
2、webを開く.configルートディレクトリのcustomErrors(viewsディレクトリの下のweb.configではありません)
コードは次のとおりです.
<customerrors mode="On" defaultredirect="~/Error/HttpError">

    <error redirect="~/Error/NotFound" statuscode="404" />

</customerrors>

defaultredirectは、すべてのエラーページが転向するように設定されたエラーページアドレスであり、中のerror要素は、404に対応するページアドレスを定義する異なるエラーページ転向アドレスを個別に定義することができる. 
3、必要なエラーページを定義する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>

}

三、handleError attributeの使用には以下の制限がある.
1.exceptionレコードはサポートされていません2.500以外のhttp exception 3をキャプチャできません.コントローラ以外から投げ出す異常は処理できない.ajax呼び出しexceptionが表示されると、エラーページの内容が返されます
変換元:http://www.studyofnet.com/news/316.html