Maison >développement back-end >C++ >Comment puis-je conserver tous les détails des exceptions en attendant une tâche avec AggregateException ?

Comment puis-je conserver tous les détails des exceptions en attendant une tâche avec AggregateException ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-12 16:11:43633parcourir

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

Opérations asynchrones et AggregateException : conserver les informations sur les exceptions

En attendant une tâche qui a échoué, await renvoie généralement l'exception stockée. Cependant, si l'exception stockée est AggregateException, la première exception sera simplement renvoyée.

Pour résoudre ce problème et détecter tous les messages d'erreur, tenez compte des bonnes pratiques suivantes :

Utiliser les méthodes d'extension

Vous pouvez créer une méthode d'extension WithAggregateException qui préserve la trace de la pile d'exceptions d'origine si elle est présente :

<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>

En utilisant cette méthode d'extension, vous pouvez attendre les tâches et gérer AggregateException comme une seule entité avec les détails conservés.

Exemple

Considérons l'exemple suivant :

<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>

Sortie :

<code>捕获所有异常:
异常 1
异常 2</code>

Cette méthode d'extension vous permet de conserver toutes les informations d'exception en attendant la tâche, garantissant ainsi que les détails de l'erreur ne sont pas accidentellement perdus.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn