Gestion asynchrone des exceptions Aggregate avec un serveur personnalisé
L'approche standard de gestion des tâches ayant échoué contenant des AggregateException
aboutit à ce que seule la première exception soit levée, tandis que les autres sont perdues. Cela pose un problème important lorsque des détails complets sur les exceptions sont cruciaux pour le débogage et l'analyse des erreurs.
Le défi :
Comment pouvons-nous capturer et renvoyer efficacement le AggregateException
complet lors d'une opération asynchrone, en évitant des solutions de contournement fastidieuses telles que des blocs try-catch
explicites ou des appels Task.Wait()
directs ?
Solution : Un serveur personnalisé
Modifier directement le TaskAwaiter
intégré est complexe. Une solution plus pratique consiste à créer un waiter personnalisé pour gérer correctement les AggregateException
.
Méthode WithAggregateException
améliorée :
<code class="language-csharp">public static async Task WithAggregateException(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Handle cancellation separately. if (source.IsCanceled) throw new TaskCanceledException(source); // Re-throw the original exception, preserving stack trace. ExceptionDispatchInfo.Capture(ex).Throw(); } }</code>
Cette méthode d'extension améliore la classe Task
. Il intercepte les exceptions pendant l'opération d'attente, garantissant que l'AggregateException
d'origine (ou ses exceptions internes s'il s'agit d'un autre type d'exception), ainsi que sa trace complète de pile, sont renvoyés. Cela fournit un mécanisme de gestion des erreurs plus propre et plus informatif.
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!