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
Libérer: 2025-01-12 16:11:43
original
665 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

Sortie :

<code>捕获所有异常:
异常 1
异常 2</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal