非同步 C# 和 AggregateException 的挑戰
使用 await
在 C# 處理非同步操作時,需要仔細注意管理故障任務的異常。 雖然 await
通常會重新拋出 AggregateException
中遇到的第一個異常,但遺憾的是後續異常會遺失。這種遺漏可能會導致錯誤報告不完整併阻礙調試工作。
解決方案:保留異常詳細資訊
為了有效保留 AggregateException
中包含的所有異常詳細信息,自定義擴展方法提供了一個強大的解決方案:
<code class="language-csharp">public static async Task WithAggregateExceptionHandling(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Preserve original exception context ExceptionDispatchInfo.Capture(source.Exception ?? new Exception("Task was cancelled or encountered an unknown error.")).Throw(); } }</code>
此擴充方法將 await
呼叫封裝在 try-catch
區塊中。 至關重要的是,它使用 ExceptionDispatchInfo.Capture
重新拋出原始異常(如果任務被取消,則拋出預設異常),確保維護完整的異常上下文(包括堆疊追蹤)。
實作範例
整合此方法非常簡單:
<code class="language-csharp">Task[] tasks = new[] { /* ... your tasks ... */ }; await Task.WhenAll(tasks).WithAggregateExceptionHandling(); // Rethrows AggregateException with full context</code>
透過採用這種方法,開發人員可以有效地處理非同步 C# 程式碼中的 AggregateExceptions
,防止遺失有價值的錯誤資訊並促進更徹底的錯誤處理和偵錯。
以上是在非同步 C# 程式碼中處理 AggregateException 時,如何防止遺失錯誤訊息?的詳細內容。更多資訊請關注PHP中文網其他相關文章!