非同步程式設計中AggregateException的處理難題
在非同步程式設計的世界中,await
關鍵字提供了一種優雅的方式來暫停執行,直到任務完成。但是,當處理出錯的任務時,await
會引入一個細微的問題:它會重新拋出AggregateException
中的第一個異常,從而可能丟失寶貴的錯誤訊息。
為了解決這個問題,開發人員面臨一個難題。他們可能會求助於一些不優雅的解決方案,或嘗試使用自訂awaiter
。但是,在await
中乾淨地處理AggregateException
的最佳實踐仍然難以捉摸。
問題的答案
與標題中的建議相反,在這種情況下await
的預設行為通常是有益的。在大多數情況下,只知道一個異常就足夠了。真正的挑戰在於以允許選擇性異常處理的方式來處理AggregateException
。
為了實現這一點,以下擴充方法提供了一個簡潔的解決方案:
<code class="language-csharp">public static async Task WithAggregateException(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // source.Exception 可能为 null,如果任务被取消。 if (source.Exception == null) throw ex; // 抛出原始异常,例如取消异常 // EDI 保留原始异常的堆栈跟踪,如果有的话。 ExceptionDispatchInfo.Capture(source.Exception).Throw(); } }</code>
透過將await
操作封裝在一個try-catch
區塊中,此方法允許開發人員存取AggregateException
並使用ExceptionDispatchInfo.Capture
重新拋出它。這保留了原始異常的堆疊跟踪,使開發人員能夠適當地處理錯誤。 修改後的程式碼更完整地處理了任務取消的情況。
以上是使用'await”時如何最好地處理聚合異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!