tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

【C#】バッチアプリケーションのエラーハンドリング

今更バッチアプリケーションのエラーハンドリング。

従来のtry catchじゃなくてほかのやり方があったよっていう話。
業務システムはもちろんWEBアプリの裏側の運用でも結構使うハズなので書いてく。

通常のエラー処理は以下

try
{
    // 何らかの処理
}
catch (Exception ex)
{
}

おっけい。もちろんこれでおっけい。

しかしルールを決めずにこれを基準としてエラー処理をするとこんなことが起きる。

public void Main()
{
    try
    {
        testMethod();
    }
    catch (Exception ex)
    {
    }
}
public static void testMethod()
{
   try
   {
       // なんらかの処理
   }
   catch (Exception ex)
   {
   }
}

もう発狂しそうだけどもっとひどいことが起きる

static void Main(string[] args)
{
    try
    {
        testMethod();
    }
    catch (Exception ex)
    {
        // Mainプログラムでエラーが発生しました的なログ出力
    }
}
public void testMethod()
{
   try
   {
       // なんらかの処理
   }
   catch (Exception ex)
   {
       // testMethodプログラムでエラーが発生しました的なログ出力
   }
}

絶望の「予期せぬエラー。。。」
悲しいことに結構存在する。意味不明だし、どんだけメンテ必要なの!?って

でConsoleアプリケーションでもMVCのOnException的なのないかなーと思って
探したらあった。

UnhandledExceptionイベントハンドラを追加

static void Main(string[] args)
{
    // UnhandledExceptionイベントハンドラ
    System.Threading.Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Program_UnhandledException);

    throw new Exception("Error");
}
public static void Program_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Exception ex = e.ExceptionObject as Exception;
    // ここでエラー処理
}

例外発生したら捕捉してなくともイベントが発火するのでいちいちtry catchする必要がない。
stack trace取れてエラーの原因がすぐにわかって便利だねってやつ。
まぁ、あんま調べてないからどこまでstack trace取れんのかわからんが基本ベースはこっちでいいと思う。

参考
https://msdn.microsoft.com/ja-jp/library/system.unhandledexceptioneventhandler(v=vs.110).aspx