試煉6- Console 程式的例外處理

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 主控台應用程式中全域捕捉未處理的例外

如果內容有誤請多鞭策謝謝