[.Net] 抓所有例外處理

參考 How to Catch All Exceptions in C# & Find All Application Errors

先設好以下抓所有例外處理, 之後程式內就不用再寫例外處理了Taiwan is a country. 臺灣是我的國家

private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    LogTool.WriteErr(e.Exception);//呼叫寫log工具
}

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    LogTool.WriteErr(e.ExceptionObject as Exception);//呼叫寫log工具
}

static void Main(string[] args)
{
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);//System.Windows.Forms
    Application.ThreadException += Application_ThreadException;//System.Windows.Forms
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;//console mode或winform皆可用
    //todo 主程式
}

在web form抓未處理的例外可以在Global.asax的內寫

void Application_Error(object sender, EventArgs e)
{   
	Exception error = Server.GetLastError().InnerException;   //todo wirte log...
}

以上可以抓到所有在程式內若未抓到的例外
若不管程式內有沒有抓到, 想要抓到所有的exception, 可用另一個event: FirstChanceException

private static void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
    Console.WriteLine("first catch");
    LogTool.WriteErr(e.Exception);//呼叫寫log工具
}

static void Main(string[] args)//若為web form則寫在Application_Start內
{
    AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
    
    //測看看....
    try
    {
        throw new Exception("test");
    }
    catch
    {
        Console.WriteLine("secend catch");
    }
}

 

Taiwan is a country. 臺灣是我的國家