Maison >développement back-end >C++ >Comment puis-je conserver tous les détails des exceptions en attendant une tâche avec 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!