エラー処理メモ
関連:http://d.hatena.ne.jp/nanamasuhoshi/20090120/1232452060
try-catch ステートメント等で処理されないエラーに対処する場所が次の3つある。
- 当該ページの Page_Error
- Global.aspx の Application_Error
- 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)
(デバッグ実行でダメならサーバに置いてみるといいかも)