全域非同步任務異常處理機制探究
.NET 4.5 引入非同步程式設計後,一個關鍵問題浮出水面:應用程式能否定義一個全域異常處理程序來捕捉非同步 Task 方法中拋出的例外?
非同步任務中異常傳播機制
非同步 Task 方法中發生的異常必須由處理任務完成的程式碼來觀察。如果任務未被觀察到,異常將處於休眠狀態。
例如程式碼片段:
<code>string x = await DoSomethingAsync();</code>
如果 DoSomethingAsync 拋出異常,只有在處理 await 表達式時才會被觀察到,例如將程式碼放在 try-catch 區塊中。未能觀察到異常會導致異常未被處理,並可能被忽略。
AppDomain 與未觀察到的任務異常
.NET 4.5 提供兩個事件來處理未觀察到的異常:
UnhandledException 事件通常用於處理同步程式碼中未被觀察到的異常。然而,對於非同步 Task 異常,當任務嘗試垃圾回收時,通常由 UnobservedTaskException 事件處理。
啟用 UnhandledException
預設情況下,.NET 4.5 不會為未觀察到的非同步任務異常觸發 UnhandledException 事件。可以透過在應用程式設定檔中將 ThrowUnobservedTaskExceptions 屬性設為 true 來變更此行為。
非同步 void 方法
對於非同步 void 方法,異常處理行為有所不同。由於沒有任務引用可供觀察,因此異常會立即在目前同步上下文中拋出。在 WPF 中,這可能會導致一系列事件被觸發,包括 Dispatcher.UnhandledException,並可能導致應用程式崩潰。由於沒有任務,因此在這種情況下不會觸發 TaskScheduler.UnobservedTaskException。
總結
雖然可以為同步未觀察到的異常定義全域異常處理程序,但在異步 Task 方法中拋出的異常的行為更為細緻。務必了解這些異常的傳播方式並相應地處理它們,以防止它們未被觀察到並導致意外的應用程式行為。
以上是.NET 4.5 應用程式可以為非同步任務異常定義全域異常處理程序嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!