Maison >développement back-end >C++ >Comment puis-je attendre avec précision les tâches et gérer les AggregateExceptions sans perdre les détails des exceptions ?
Conservation des détails des exceptions lors de l'attente de tâches défaillantes avec AggregateExceptions
La programmation asynchrone implique souvent des tâches en attente. Cependant, lorsqu'une tâche échoue et contient un AggregateException
, l'opérateur standard await
ne renvoie que la première exception, perdant potentiellement des informations de diagnostic cruciales. Cet article détaille une solution robuste pour gérer et conserver avec précision toutes les exceptions au sein d'un AggregateException
.
Le défi réside dans la préservation de l'original AggregateException
tout en utilisant la commodité de await
. Même si un bloc try-catch
peut sembler suffisant, une solution plus élégante et informative est préférable. La création d'un serveur d'attente personnalisé est possible, mais ajoute une complexité inutile.
Considérez cet exemple illustrant le problème :
<code class="language-csharp">static async Task Run() { Task[] tasks = new[] { CreateTask("ex1"), CreateTask("ex2") }; await Task.WhenAll(tasks); } static Task CreateTask(string message) { return Task.Factory.StartNew(() => { throw new Exception(message); }); }</code>
Dans Run
, une seule exception est renvoyée, malgré deux exceptions survenues dans les tâches sous-jacentes.
La solution utilise une méthode d'extension :
<code class="language-csharp">public static async Task HandleAggregateExceptions(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Check for null Exception in case of cancellation if (source.Exception == null) throw; // ExceptionDispatchInfo preserves the original exception's stack trace. ExceptionDispatchInfo.Capture(source.Exception).Throw(); } }</code>
Cette méthode d'extension HandleAggregateExceptions
garantit que toutes les exceptions au sein d'un AggregateException
sont correctement renvoyées, en préservant leurs traces de pile d'origine. Cela facilite une gestion approfondie des erreurs et simplifie le débogage. En utilisant cette méthode, l'appel de await tasks.HandleAggregateExceptions();
fournira des détails complets sur l'exception.
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!