テスターですが何か?

ホビープログラマ略してHPです

ASP.NETの未処理例外を扱う

leave a comment »

「東京電力 節電効果計測サイト」を開発中の話。ローカルでVisual Web Developerからデバッグ実行中に例外が発生しても、そこで処理が中断するので全く問題ないのですが、デプロイ後の環境で例外が発生するともう訳が分からなくなります。なので、ASP.NETで未処理例外を補足する処理を記述していきます。

 

まず、Web.configに未処理例外が発生した場合に転送されるページを定義します。もちろん、このページは事前に作成しておいてください。

<system.web>
   
<customErrors mode="On" defaultRedirect="Error.aspx" />
        <httpHandlers>
   <add path="ChartImg.axd" verb="GET,HEAD,POST" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    validate="false" />
  </httpHandlers>

 

次に、Global.aspx.csに未処理例外が発生した際に実行される処理を記述します。発生した例外の内容をログに出力する最低限の処理のみを行っています。注意点として、発生した例外は、基本的にHttpUnhandledExceptionにラップされているますが、必ずラップされているわけではないことです。そんため、ifステートメントで条件分岐を行っています。

void Application_Error(object sender, EventArgs e)
{
     Exception ex;

     using (var Sw = new StreamWriter(Server.MapPath("/error.log"), true, Encoding.GetEncoding("Shift_JIS")))
     {
         if (Server.GetLastError() is HttpUnhandledException)
         {
             ex = Server.GetLastError().InnerException;
         }
         else
         {
             ex = Server.GetLastError();
         }
        
         var sb = new StringBuilder();
         sb.AppendLine(DateTime.Now.ToString() + " " + ex.GetType().ToString());
         sb.AppendLine(ex.Message);
         sb.AppendLine(ex.StackTrace);

         Sw.Write(sb.ToString());
     }
}

意図的に例外が発生する処理を記述し、結果を確認します。

image

エラーログには、以下のように記録されます。

2011/04/02 10:41:01 System.FormatException
入力文字列の形式が正しくありません。
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   場所 System.Int32.Parse(String s)
   場所 LightElectricity._Default.Page_Load(Object sender, EventArgs e) 場所 D:\Develop\LightElectricity\LightElectricity\Default.aspx.cs:行 16
   場所 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   場所 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   場所 System.Web.UI.Control.OnLoad(EventArgs e)
   場所 System.Web.UI.Control.LoadRecursive()
   場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

 

今回のエントリーは以上です、ASP.NETに未処理例外を埋め込むのに以下のサイトを参考にさせていただきました。

ASP.NETでの例外処理

Written by david9142

2011年4月2日 @ 10:56 AM

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。