Asynchrone Vorgänge und AggregateException: Ausnahmeinformationen beibehalten
Wenn Sie auf eine fehlgeschlagene Aufgabe warten, await
wird normalerweise die gespeicherte Ausnahme erneut ausgelöst. Wenn die gespeicherte Ausnahme jedoch AggregateException
ist, wird nur die erste Ausnahme erneut ausgelöst.
Um dieses Problem zu beheben und alle Fehlermeldungen abzufangen, beachten Sie die folgenden Best Practices:
Verwenden Sie Erweiterungsmethoden
Sie können eine Erweiterungsmethode WithAggregateException
erstellen, die den ursprünglichen Ausnahme-Stack-Trace beibehält, falls vorhanden:
<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>
Mit dieser Erweiterungsmethode können Sie auf Aufgaben warten und AggregateException
als eine Einheit mit beibehaltenen Details bearbeiten.
Beispiel
Betrachten Sie das folgende Beispiel:
<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>
Ausgabe:
<code>捕获所有异常: 异常 1 异常 2</code>
Mit dieser Erweiterungsmethode können Sie alle Ausnahmeinformationen beibehalten, während Sie auf die Aufgabe warten, und so sicherstellen, dass Fehlerdetails nicht versehentlich verloren gehen.
Das obige ist der detaillierte Inhalt vonWie kann ich alle Ausnahmedetails beibehalten, wenn ich mit AggregateException auf eine Aufgabe warte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!