Heim > Backend-Entwicklung > C++ > Wie kann ich alle Ausnahmedetails beibehalten, wenn ich mit AggregateException auf eine Aufgabe warte?

Wie kann ich alle Ausnahmedetails beibehalten, wenn ich mit AggregateException auf eine Aufgabe warte?

Linda Hamilton
Freigeben: 2025-01-12 16:11:43
Original
662 Leute haben es durchsucht

How Can I Preserve All Exception Details When Awaiting a Task with AggregateException?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Ausgabe:

<code>捕获所有异常:
异常 1
异常 2</code>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage