asp.net-mvc - net - handleerrorattribute view



ASP.net MVC[HandleError]例外をキャッチしない (4)

2つの異なるアプリケーションでは、新しいVS2008 MVCプロジェクトで得られるもう1つのサンプルMVCアプリケーションである[HandleError]は例外をキャッチしていません。

サンプルアプリケーションで私は持っている:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        throw new Exception();
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

これはテスト用に例外がスローされたデフォルトコントローラです。

しかし、それは動作しません。 デフォルトのerror.aspxページに行く代わりに、デバッグ情報をブラウザに表示します。

この問題は、私が作業しているカスタムアプリケーションで最初に切り詰められ、サンプルアプリケーションでテストするようになりました。 カスタムアプリケーションで行った変更と何か関係があったと考えて、サンプルアプリケーションを完全に変更せずに、インデックスメソッドのスロー例外(yuck)を残しました。

私は困惑している。 私は何が欠けていますか?

https://src-bin.com


Answer #1

Web.configでは、customErrorsを変更します。

<system.web>
  <customErrors mode="On">
  </customErrors>

modeがOffまたはRemoteOnlyの場合、カスタムエラーページではなく黄色の死の画面が表示されます。 その理由は、開発者は通常、黄色の死の画面についてより詳細な情報を求めているということです。


Answer #2

HandleErrorしてください:私のケースでは、 Controllerコンストラクタ内にスローされたexceptionをキャッチするためにHandleError属性を取得しようとしていHandleError ! もちろんそれはそれをキャッチしません。 HandleError属性は、 Controller アクション内にスローされた例外だけをキャッチします。 それはMSDNのページにあります(もっと注意を払ってください)。

アクションメソッドによってスローされる例外を処理するために使用される属性を表します。

もう一つ起こっていることは、コントローラのOnException(ExceptionContext exceptionContext)オーバーライドされたメソッドが決して呼び出されなかったことです。 私はControllerのコンストラクタ内で例外を投げていたので、もちろん、それは呼び出されませんでした。

私はこれを理解しようとして1時間を費やしました。 :o)それが次の魂を助けることを願っています...

ヒントとして、 HandleError属性は500エラーしかHandleErrorないことにHandleErrorしてHandleError 。 他のものについては、 Web.config <customErrors>セクションを宣言する必要があります。

<customErrors mode="On">
  <error statusCode="403" redirect="~/403" />
  <error statusCode="404" redirect="~/404" />
</customErrors>

Answer #3

重要:エラーページ自体にエラーがないことに注意してください。

それができれば、ASP.NETのカスタムエラーページが表示され、サークルに移動して髪を引き裂くことになります。 おそらくエラーの原因となる可能性があるすべてのものをページから削除し、テストしてください。

また、 'customErrors'がONまたはOFFの場合、フレンドリーなエラーページ(あなたのErrors.aspx)ページが表示されるかどうかにいくつか寄与する要素があります。

このブログを見る(下記を除く)

HttpContext.IsCustomErrorEnabled - 3つの異なるソースを調べる

  1. web.configの<deployment>セクションの小売プロパティ。 これは、アプリケーションを実動サーバーにデプロイするときに設定するのに便利なプロパティーです。 これにより、カスタムエラーのその他の設定が上書きされます。
  2. web.configの<customErrors>セクションのmodeプロパティ。 この設定は、カスタムエラーをまったく有効にするかどうかを示します。カスタムエラーが有効になっている場合は、リモートリクエストに対してのみ有効です。
  3. HttpRequestオブジェクトのIsLocalプロパティ。 カスタムエラーがリモート要求に対してのみ有効な場合、その要求がリモートコンピュータからのものかどうかを知る必要があります。

ここでのアイデアは、開発中に 'customErrors'をオフにしておくことができます。エラーを見たい場合は、それを本番環境でのみ有効にします。

このMSDNの記事では、属性について詳しく説明します。


Answer #4

この問題のもう一つの理由は、

テンプレートMVCアプリケーション(VS2008 / VS2008 Expressで生成)では、Error.aspx(VSで生成)はマスターページを使用します。

マスターページがViewDataにアクセスすると、null参照Exceptionがスローされ、error.aspxは表示されません。

あなたのError.aspxとしてこのシンプルなコードを使用し、問題を解決します(CustomErrors = Onと共に)

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>




handleerror