.NET TIPS

[ASP.NET AJAX]非同期通信時に発生した例外情報をロギングするには?[2.0、3.0、3.5、C#、VB]

山田 祥寛
2008/06/05

 「TIPS:[ASP.NET]アプリケーション内で発生したエラー情報をロギングするには?」で紹介したように、Global.asaxを利用することでアプリケーションで発生した例外情報をロギング(=ログ出力)することができる。

 ただし、非同期ポストバックで発生した例外情報をロギングしようとした場合には注意が必要だ。というのも、「TIPS:[ASP.NET AJAX]非同期通信で発生した例外の処理方法を変更するには?」で紹介したように、ASP.NET AJAXでは非同期ポストバックで例外が発生した場合にも、AllowCustomErrorRedirectプロパティをFalseに設定することでカスタム・エラー・ページへのリダイレクトを抑制できるからだ。そして、この場合にはGlobal.asaxのApplication_Errorイベント・ハンドラは実行されないのである(そもそもカスタム・エラー・ページが設定されていない場合も同様)。非同期ポストバックで発生した例外情報を確実にロギングするには、ScriptManager.AsyncPostBackErrorイベントを利用する必要がある。

 以下に、その具体的な例を示してみよう。以下は、「TIPS:[ASP.NET AJAX]非同期通信で発生した例外の処理方法を変更するには?」で紹介したCustomError.aspxに対して、AsyncPostBackErrorイベント・ハンドラを追加した例である。

protected void manager_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e) {

  // ログ・ファイルerror.logへの出力ストリームを生成
  using (System.IO.StreamWriter writer =
    new System.IO.StreamWriter(
      Server.MapPath("~/error.log"),
      true, Encoding.GetEncoding("Shift_JIS"))) {

    // 非同期ポストバックで発生した例外情報を取得
    Exception ex = e.Exception;

    // 日付、ソース・コード、エラー・メッセージ、エラー原因
    // となったメソッドをタブ区切りテキストで記録
    StringBuilder builder = new StringBuilder();
    builder.Append(DateTime.Now.ToString());
    builder.Append("\t");
    builder.Append(ex.Source);
    builder.Append("\t");
    builder.Append(ex.Message);
    builder.Append("\t");
    builder.Append(ex.TargetSite.ToString());
    writer.WriteLine(builder.ToString());
    writer.Close();
  }
}
Protected Sub manager_AsyncPostBackError(ByVal sender As Object, ByVal e As System.Web.UI.AsyncPostBackErrorEventArgs) Handles manager.AsyncPostBackError

  ' ログ・ファイルerror.logへの出力ストリームを生成
  Using writer As New System.IO.StreamWriter( _
      Server.MapPath("~/error.log"), _
      True, Encoding.GetEncoding("Shift_JIS"))

    ' 非同期ポストバックで発生した例外情報を取得
    Dim ex As Exception = e.Exception

    ' 日付、ソース・コード、エラー・メッセージ、エラー原因
    ' となったメソッドをタブ区切りテキストで記録
    Dim builder As New StringBuilder()
    builder.Append(DateTime.Now.ToString())
    builder.Append(Chr(9))
    builder.Append(ex.Source)
    builder.Append(Chr(9))
    builder.Append(ex.Message)
    builder.Append(Chr(9))
    builder.Append(ex.TargetSite.ToString())
    writer.WriteLine(builder.ToString())
    writer.Close()
  End Using
End Sub
非同期ポストバックで発生した例外情報をロギングするコード(上:CustomError.aspx.cs、下:CustomError.aspx.vb)

 非同期ポストバックで発生した例外情報は、AsyncPostBackErrorイベント・ハンドラの第2パラメータに渡されたAsyncPostBackErrorEventArgsオブジェクト(System.Web.UI名前空間)のExceptionプロパティを介して取得することが可能だ。

 ここでは、取得したExceptionオブジェクトからエラーの発生元や例外メッセージ、エラー原因となったメソッドなどの情報を取り出し、これをログ・ファイルerror.logに記録しているというわけだ。

 以上を理解したら、CustomError.aspxを実行し、[更新]ボタンをクリックしてみよう。アプリケーション・ルートの直下にerror.logファイルが作成され、以下のようなログ情報が記録されていれば成功である。

AsyncPostBackErrorイベント・ハンドラによって記録されたログ

 ちなみに、Global.asaxのApplication_Errorイベント・ハンドラでもロギング処理を行っており、かつ、ページのAllowCustomErrorRedirectプロパティをTrueに設定している場合には、AsyncPostBackErrorイベント・ハンドラとApplication_Errorイベント・ハンドラの双方でロギングが行われてしまうので、要注意だ。AsyncPostBackErrorイベント・ハンドラで例外を処理している場合は、重ねて例外処理が行われないよう、AllowCustomErrorRedirectプロパティはFalseに設定するのが好ましい。End of Article

利用可能バージョン:.NET Framework 2.0
利用可能バージョン:.NET Framework 3.0
利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:ASP.NET AJAX
関連TIPS:[ASP.NET]アプリケーション内で発生したエラー情報をロギングするには?
関連TIPS:[ASP.NET AJAX]非同期通信で発生した例外の処理方法を変更するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET AJAX]非同期通信で発生した例外の処理方法を変更するには?
[ASP.NET MVC]例外フィルタをカスタマイズするには?
WPF:例外をまとめてトラップするには?[C#/VB]
[ASP.NET]アプリケーション共通のロギングを行うには?(Global.asax編)
[ASP.NET]アプリケーション内で発生したエラー情報をロギングするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間