C# asynchrone et le défi des AggregateExceptions
Lorsque vous travaillez avec des opérations asynchrones en C# à l'aide de await
, la gestion des exceptions des tâches défaillantes nécessite une attention particulière. Alors que await
renvoie généralement la première exception rencontrée dans un AggregateException
, les exceptions suivantes sont malheureusement perdues. Cette omission peut conduire à un rapport d'erreurs incomplet et entraver les efforts de débogage.
La solution : préserver les détails des exceptions
Pour préserver efficacement tous les détails d'exception contenus dans un AggregateException
, une méthode d'extension personnalisée offre une solution robuste :
<code class="language-csharp">public static async Task WithAggregateExceptionHandling(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Preserve original exception context ExceptionDispatchInfo.Capture(source.Exception ?? new Exception("Task was cancelled or encountered an unknown error.")).Throw(); } }</code>
Cette méthode d'extension encapsule l'appel await
dans un bloc try-catch
. Surtout, il utilise ExceptionDispatchInfo.Capture
pour renvoyer l'exception d'origine (ou une exception par défaut si la tâche a été annulée), garantissant ainsi que le contexte complet de l'exception, y compris la trace de la pile, est conservé.
Exemple de mise en œuvre
L'intégration de cette méthode est simple :
<code class="language-csharp">Task[] tasks = new[] { /* ... your tasks ... */ }; await Task.WhenAll(tasks).WithAggregateExceptionHandling(); // Rethrows AggregateException with full context</code>
En employant cette approche, les développeurs peuvent gérer efficacement AggregateExceptions
dans du code C# asynchrone, évitant ainsi la perte d'informations précieuses sur les erreurs et facilitant une gestion et un débogage plus approfondis des erreurs.
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!