エラー処理メモ

関連:http://d.hatena.ne.jp/nanamasuhoshi/20090120/1232452060
try-catch ステートメント等で処理されないエラーに対処する場所が次の3つある。

  1. 当該ページの Page_Error
  2. Global.aspx の Application_Error
  3. web.config の customErrors 要素

上記の順で処理され、Sever.ClearError()を呼び出すとその後の処理は発生しない。また、方法 : 安全なエラー メッセージを表示するとその他(例えばエラー ハンドラの完全なコード例)では説明に違いが見られるが、Application_Error を書くと customErrors の defaultRedirect より優先されるようだ。(次のようなコードで試した。Microsoft Visual Studio 2008/.NET Framework 3.5 IIS6.0)

// Global.aspx
protected void Application_Error(object sender, EventArgs e) {
    Server.Transfer("GenericErrorPage.aspx", true);
}

<!-- web.config -->
<customErrors defaultRedirect="~/HttpErrorPage.aspx" mode="RemoteOnly"/>

エラー ハンドラの完全なコード例の内容を試したが私の環境のせいかもしれないが localhostデバッグ実行ではうまくいかず、サーバに置いたら機能した(制限以上のサイズのファイルアップロードで System.Web.HttpException 発生)。
また、web.config で HttpErrorPage.aspx に飛ばすようにした場合 Sever.GetLastError() の戻り値が null だったようだ。こっちはよく分からない。

まとめ

エラー ハンドラの完全なコード例

  • web.config で HttpErrorPage.aspx を設定し、Application_Error とかを記述しないと HttpErrorPage.aspx に飛ぶが、GetLastError() でエラーは取得できないっぽい。
  • Page_Error なり Application_Error なりで Server.Transfer("GenericErrorPage.aspx", true); を書けばそこに飛ぶ。(ClearError() は GenericErrorPage.aspx 側でやってるのでおk)

デバッグ実行でダメならサーバに置いてみるといいかも)