有時是自己沒做好例外處理,有時是引用的第三方套件出意外,在此紀錄幾個處理和查找錯誤的最後手段
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
//Task沒正常結束,沒try-catch,例外就會被TaskScheduler.UnobservedTaskException捕捉
void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
e.SetObserved(); //否則會結束程序
if (e.Exception != null)
{
//Do something.
if (e.Exception.InnerExceptions != null)
{
foreach (Exception ex in e.Exception.InnerExceptions)
{
//Do something.
}
}
}
}
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
//應用程式掛掉才可能觸發,除了紀錄log也沒其他事可做
//有可能在處理例外時引發其他例外,要小心
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
if (e.ExceptionObject is Exception ex)
{
//Do something.
}
}
第三方套件如果不是.net寫的(譬如可能是C/C++寫的dll),以上方法很可能都無法捕捉例外,此時只剩最後一招,
Windows系統管理工具-->事件檢視器,去查OS的錯誤紀錄,
但通常幫助不大,已經無法釐清和解決問題