QA@IT

例外エラーがHttpUnhandledExceptionになってしまう・・

9652 PV

教えてください。

global.aspx.csのapplication_errorで
Exception ex = server.getlasterrorを
みると、httpunhandledexceptionが取得されてしまい
InnerExceptionに現在の例外とされてしまうのですが、
これは仕様でしょうか?

例えば、testexceptionというようなcustomexceptionを作り
それを例外としてスローし、global.aspx.csで
server.getlasterrorでtestexceptionを取得するには
どのようにすればよいのでしょうか?

① TestExceptionをスローする

protected void Page_Load(object sender, EventArgs e)
{

            throw new TestException();
}

② Exception ex = Server.GetLastErrorでTestExceptionでなくhttpunhandledExceptionとなってしまう。。

void Application_Error(object sender, EventArgs e)
{
            // ハンドルされていないエラーが発生したときに実行するコードです
            //  アプリケーションのシャットダウンで実行するコードです
            Exception ex = Server.GetLastError();

            return;
}

回答

ハンドルされない例外が HttpUnhandledException にラップされて取得されるのは仕様、だと思われるのですが、ざっと探した限り、明確にそのような仕様であるとするドキュメントの類は見当たらないですねえ。

強いて言えば
http://www.asp.net/web-forms/tutorials/aspnet-45/getting-started-with-aspnet-45-web-forms/aspnet-error-handling
にあるチュートリアルの「Adding Application-Level Error Handling」の項で、それらしきエラー処理の方法が説明されてはいますが…

では最終手段、ということで
http://referencesource.microsoft.com/netframework.aspx
から .NET Framework のソースコードを取得して System.Web.UI.Page クラスのソースを見たところ、HandleError() メソッド(ページのリクエスト処理で例外発生時に呼ばれる)の最後が

    throw new HttpUnhandledException(null, traceString, e); 

となっているので、やはりハンドルされなかった例外は最終的に HttpUnhandledException にラップして再スローされるようです。なので、GetLastError() で HttpUnhandledException が取得された場合は InnerException をチェックする、ということでよろしいのではないかと思います。

    Exception ex = Server.GetLastError();
    if (ex is HttpUnhandledException)
    {
        // アプリケーションの例外
        if (ex.InnerException is TestException)
        {
            // TestException の場合...
        }
        // else
        // {
        //     // ...
        // }
    }
    else
    {
        // ASP.NET の例外...
    }
編集 履歴 (0)
  • レス遅なりました。

    参考になりました、わかりやすい解説ありがございます。

    -

仕様のようですね。

Page でハンドルされなかった例外は HttpUnhandledException にラップされて HttpApplication オブジェクトに渡されるようです。理由は、ASP.NET ランタイムは内部で発生した例外であることを容易に識別できるようにするためとのことです。

詳しくは以下のページの[例外オブジェクトのネスト]のセクションを見てください。

.NET の例外処理 Part. 4
http://blogs.msdn.com/b/nakama/archive/2009/01/23/net-part-4.aspx

編集 履歴 (0)
  • レスありがとうございます

    参考にさせていただきます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。