HandleErrorAttribute
があり、MSDNで述べられているように、
アクションメソッドによって発生した例外の処理に使用される属性を表します。
しかし、どこでも、同じMSDNでは、サーバー応答コードを500に設定する例外のみを処理することは言われていません(
HandleErrorAttribute
のソースコードを確認するの
HandleErrorAttribute
簡単です。 次の行があります。
// If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method), // ignore it. if (new HttpException(null, exception).GetHttpCode() != 500) { return; }
私はあなたについては知りませんが、例外が発生すると、ユーザーが「死の黄色いページ」ではなく、サーバー応答コード(Web.configの設定によって異なります)後で詳しく説明します)。
独自のAnalog HandleErrorAttribute
作成
そのため、標準の
HandleErrorAttribute
は私たちに合わないことがわかったので、独自に作成してみましょう。
もちろん、
IExceptionFilter
インターフェイスから継承するクラスを作成できますが、一般に、すべての例外を処理した場合の標準
HandleErrorAttribute
動作に満足しています。 そして、ほとんどすべてが私たちに合っているので、クラスは私たちにとって好ましくない
HandleErrorAttribute
から継承します。
public class HandleAllErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } // If custom errors are disabled, we need to let the normal ASP.NET exception handler // execute so that the user can see useful debugging information. if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled) { return; } Exception exception = filterContext.Exception; if (!ExceptionType.IsInstanceOfType(exception)) { return; } string controllerName = (string)filterContext.RouteData.Values["controller"]; string actionName = (string)filterContext.RouteData.Values["action"]; HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); filterContext.Result = new ViewResult { ViewName = View, MasterName = Master, ViewData = new ViewDataDictionary<HandleErrorInfo>(model), TempData = filterContext.Controller.TempData }; filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = new HttpException(null, exception).GetHttpCode(); // Certain versions of IIS will sometimes use their own error page when // they detect a server error. Setting this property indicates that we // want it to try to render ASP.NET MVC's error page instead. filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; } }
まず、これは
HandleErrorAttribute
を確認する
HttpStatusCode
を除いて、これが標準の
HandleErrorAttribute
コードであると
HttpStatusCode
ます。
実際に彼がしていること:
- 入力パラメーターの妥当性をチェックします
-
customErrors
がcustomErrors
かどうかを確認します -
HandleErrorInfo
クラスにHandleErrorInfo
をHandleErrorInfo
しHandleErrorInfo
- 新しい
ViewResult
作成し、データで塗りつぶし、現在の代わりに割り当てます - サーバーエラーをクリアし、サーバー応答コードを設定します
クラスの準備ができました。次に、標準属性を自分のものに置き換えます。 すべてのコントローラーまたはコントローラーアクションに書き込まないように、グローバルフィルターを使用してこれを行います。 この場合、これは重要ではありませんが、実際には便利です。 したがって、 Global.asax.csに移動し、作成したばかりの属性である標準フィルターの代わりに設定します。
filters.Add(new HandleAllErrorAttribute());
テスト
ここで、フィルターが機能し、必要なデータが
View
渡されることを確認するために、標準の〜/ Views / Shared / Error.cshtmlをわずかに変更します。
@model System.Web.Mvc.HandleErrorInfo @{ ViewBag.Title = "Error"; } <h2> Sorry, an error occurred while processing your request. </h2> <h3>@Model.Exception.Message</h3>
そして、ルートにあるWeb.configの
System.Web
セクションに次の行を追加します。
<customErrors mode="On" defaultRedirect="Error" />
この行を使用して、カスタムエラー処理、より正確にはカスタムエラーページを有効にします。
ここで、例外を発生させる必要があります。これは、スタジオが作成した標準コントローラーのアクションで行います。
public ActionResult About() { throw new HttpException(403, " !"); return View(); }
それだけです! プロジェクトを開始し、「About」セクションに移動して、属性が正しく機能したことを確認します。