2022 鐵人賽文 搬回點部落
開始試煉
Exception 是程式出錯時產生的 在MVC 還是Webapi 都有 global exception handling
的處理方式 但是 Console 程式 也要處理 沒有抓到的exception
這樣的程式 出例外了 程式就停止執行了
void Main()
{
throw new Exception("2");
}
這時候可以用
AppDomain.UnhandledException 事件
簡單範例如下
void Main()
{
var currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
throw new Exception("2");
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
var exception = (Exception)args.ExceptionObject;
Console.WriteLine($"MyHandler : {exception}");
}
結果會是
MyHandler : System.Exception: 2
於 UserQuery.Main() 於 C:\Users\Demo\AppData\Local\Temp\LINQPad5_uymhsjky\query_mjrekd.cs: 行 34
於 LINQPad.ExecutionModel.ClrQueryRunner.Run()
於 LINQPad.ExecutionModel.Server.RunQuery(QueryRunner runner)
於 LINQPad.ExecutionModel.Server.StartQuery(QueryRunner runner)
於 LINQPad.ExecutionModel.Server.<>c__DisplayClass151_0.<ExecuteClrQuery>b__0()
於 LINQPad.ExecutionModel.Server.SingleThreadExecuter.Work()
於 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
於 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
於 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
於 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
於 System.Threading.ThreadHelper.ThreadStart()
延伸試煉
有用到 Task 又是另一個問題了上面作法會失效 可以參考下面文章
如何正確捕捉 Task 例外
結束試煉
例外處理一直都是很重要的試煉,接下來還會有相關試煉出現
參考
在 .NET Core 主控台應用程式中全域捕捉未處理的例外
如果內容有誤請多鞭策謝謝