非同步操作和 AggregateException:保留異常訊息
當等待一個已出錯的任務時,await
通常會重新拋出儲存的例外。但是,如果儲存的異常是 AggregateException
,它只會重新拋出第一個例外。
為了克服這個問題並捕捉所有錯誤訊息,請考慮以下最佳實踐:
使用擴充方法
您可以建立一個擴充方法 WithAggregateException
,它可以保留原始異常堆疊追蹤(如果存在):
<code class="language-csharp">public static async Task WithAggregateException(this Task source) { try { await source.ConfigureAwait(false); } catch { // 检查取消的任务。 if (source.Exception == null) throw; // 保留原始堆栈跟踪。 ExceptionDispatchInfo.Capture(source.Exception).Throw(); } }</code>
透過使用此擴充方法,您可以等待任務並將 AggregateException
作為具有保留詳細資訊的單一實體進行處理。
範例
考慮以下範例:
<code class="language-csharp">// 创建一个具有多个异常的任务。 var task = Task.FromException(new AggregateException(new Exception("异常 1"), new Exception("异常 2"))); // 使用扩展方法等待任务。 try { await task.WithAggregateException(); } catch (AggregateException ex) { Console.WriteLine("捕获所有异常:"); foreach (var innerEx in ex.InnerExceptions) { Console.WriteLine(innerEx.Message); } }</code>
輸出:
<code>捕获所有异常: 异常 1 异常 2</code>
此擴充方法可讓您在等待任務的同時保留所有異常訊息,確保不會意外遺失錯誤詳細資訊。
以上是在等待帶有 AggregateException 的任務時如何保留所有異常詳細資訊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!