使用自訂 Awaiter 非同步處理 AggregateExceptions
處理包含 AggregateException
的失敗任務的標準方法只會引發第一個異常,而其餘的都會遺失。當全面的異常詳細資訊對於偵錯和錯誤分析至關重要時,這會帶來一個嚴重的問題。
挑戰:
如何在非同步操作期間有效捕獲並重新拋出完整的 AggregateException
,避免使用顯式 try-catch
區塊或直接 Task.Wait()
呼叫等繁瑣的解決方法?
解決方案:自訂 Awaiter
直接修改內建TaskAwaiter
比較複雜。 更實用的解決方案包括建立自訂等待者來正確管理 AggregateException
。
改良的WithAggregateException
方法:
<code class="language-csharp">public static async Task WithAggregateException(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Handle cancellation separately. if (source.IsCanceled) throw new TaskCanceledException(source); // Re-throw the original exception, preserving stack trace. ExceptionDispatchInfo.Capture(ex).Throw(); } }</code>
此擴展方法增強了 Task
類別。它在等待操作期間攔截異常,確保重新拋出原始的AggregateException
(或它的內部異常,如果它是另一種類型的異常)及其完整的堆疊追蹤。 這提供了更清晰、資訊更豐富的錯誤處理機制。
以上是我們如何在不遺失內部異常的情況下等待聚合異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!