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 ?

Comment puis-je attendre avec précision les tâches et gérer les AggregateExceptions sans perdre les détails des exceptions ?

DDD
DDDoriginal
2025-01-12 15:55:43959parcourir

How Can I Accurately Await Tasks and Handle AggregateExceptions Without Losing Exception Details?

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!

Déclaration:
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