ASP.NETでApplication_ErrorによるExceptionの集中処理

3601 ワード

ASP.NETでは、Exceptionの統合集中処理によく見られる2つの方法があります.
1、Webを配置することによりconfigのcustomErrorsノードは、defaultRedirectプロパティを構成して、すべての「未処理の例外」が同じページにジャンプするように構成されています.
2、Globalを通過する.asaxでのApplication_Errorはコードを書いて自分の望む操作を実現します
しかし、実際の使用では、Application_などの問題が発生することが多い.Errorのコードは実行されず、customErrorsを使用すると、エラーメッセージがターゲットページにどのように伝達されるかなどがあります.
私の模索を通じて、いくつかの経験をまとめ、以下のように記録します.
1、Webを配置したくないconfigではcustomErrorsの方法でページジャンプを行い、Application_Errorでコードを書く処理を行い、Responseを使用します.Redirectメソッドは指定されたページにジャンプします.この理論的には良い方法は実際には通用しません.Application_ErrorにResponseと書きます.Redirectがページをジャンプしても実行されません!
2、多くの人が配置Webを使いたくない.configがエラー自動ジャンプを実現した原因は、「死」リンクにジャンプし、現在のエラー情報を伝えることができず、対応する処理ができないからにほかならない.実はこれは誤解で、どのaspxページでもサーバーを使用することができます.GetLastError()は最後の異常を取得し、thisを使用することもできる.Context.AllErrorsはすべての未処理例外を取得し、あなたが構成したページはもちろん、彼がaspxページであればいいです.
//      Exception
Exception ex = this.Context.Server.GetLastError();
//        Exception 
Exception[] errors = this.Context.AllErrors;

//             

3、ネット上でWebの使用を勧める人がいる.configとApplication_Errorを組み合わせて異常を処理してもいいですか?もちろんいいですよ.しかし、個人的にはこれは良い考えではないと思います.必要はありませんから.
彼らがどうするか見てみましょう.
Web.config
<customErrors mode="On" defaultRedirect="Error.aspx">

Global.asax
        protected void Application_Error(object sender, EventArgs e)
        {
            //      Exception
            Exception ex = this.Context.Server.GetLastError();
            //         ,     ,      

            //   Exception,OK 
            this.Context.Server.ClearError();
        }

Error.aspx
protected void Page_Load(object sender, EventArgs e)
{
        //         
}

これで大丈夫そうですね.実は問題が大きいです.アーロンには行かないことに気づくでしょうaspxページジャンプ!どうして?Application_Errorの処理優先度はWebより高い.configで設定されているカスタムエラー処理ページは、Application_Errorの中でやるべきことはすべてやった.そして、ClearにErrorを落とした.この時、Webはもうトリガーされない.configの中に配置された自動ジャンプ!
誰かが言うならアプリにいるErrorの中で処理が終わってからそのClearError()を実行しないと、彼は飛び越えたのではないでしょうか.間違いない!それはきっとジャンプできるし、Error.でもできる.aspxではこのエラーをもう一度取り出し、エラーのタイプに応じてユーザーに「フレンドリー」なエラープロンプトを与え、最後にClearErrorを実行することを忘れないでください.これは目的を達成することができますが、私は本当に必要ないと思っています.どうして必要ありませんか.下を見てください.
4、3のやり方をとる人がいるのは、対応するエラーキャプチャ処理を行いたいだけでなく、ユーザーに「フレンドリー」なカスタムインタフェースを与えたいからにほかならない.このような効果を達成するには、必ずしも2つを結合しなければならないわけではありません.いずれの方法でもできます.
A、まずWebを使うconfig構成の方法:
Web.config
<customErrors mode="On" defaultRedirect="Error.aspx">

Error.aspx
protected void Page_Load(object sender, EventArgs e)
{
//      Exception
Exception ex = this.Context.Server.GetLastError();

//             
}

B、Applicationを使うError処理
Global.asax
        protected void Application_Error(object sender, EventArgs e)
        {
            //  Exception
            Exception ex = this.Context.Server.GetLastError();
            //  Exception

            //       
            this.Context.Response.Clear();
            //                      (              ,                    )
            this.Context.Server.Transfer("/Error.aspx");
       //           (        Error.aspx  )     ,      
       this.Context.Response.Write("<script>top.location.href='/Error.aspx';</script>");
        }