Maison >développement back-end >C++ >Les exceptions levées dans les méthodes Async Void peuvent-elles être interceptées par l'appel de méthodes ?

Les exceptions levées dans les méthodes Async Void peuvent-elles être interceptées par l'appel de méthodes ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-24 02:43:10393parcourir

Can Exceptions Thrown in Async Void Methods Be Caught by Calling Methods?

Gestion des exceptions des méthodes void asynchrones

Lors de l'utilisation du CTP Async de Microsoft pour la programmation asynchrone, il est crucial de comprendre le comportement de gestion des exceptions des méthodes void asynchrones. Considérez le scénario suivant :

<code class="language-csharp">public async void Foo()
{
    var x = await DoSomethingAsync();
}

public void DoFoo()
{
    try
    {
        Foo();
    }
    catch (ProtocolException ex)
    {
        // 异常将永远不会被捕获。
    }
}</code>

La question est : l'exception levée dans la méthode asynchrone DoFoo peut-elle être interceptée dans la méthode appelante Foo ?

Réponse : Oui (mais il y a des prérequis)

Les exceptions remontent jusqu'au code d'appel, mais seulement si vous avez besoin d'un appel à await ou Wait() Foo. Modifiez le code comme suit :

<code class="language-csharp">public async Task Foo()
{
    var x = await DoSomethingAsync();
}

public async void DoFoo()
{
    try
    {
        await Foo();
    }
    catch (ProtocolException ex)
    {
        // 异常将被捕获,因为它是一个异步方法。
    }
}

public void DoFoo()
{
    try
    {
        Foo().Wait();
    }
    catch (ProtocolException ex)
    {
        // 异常将被捕获,因为调用被等待。
    }
}</code>

Cela permet la gestion des exceptions dans le code appelant.

Cependant, il est important de noter que Stephen Cleary, une autorité en matière de programmation asynchrone, met en garde :

Les méthodes "Async void ont une sémantique de gestion des erreurs différente. Lorsqu'une exception est levée à partir d'une méthode asynchrone Task ou async Task<T>, l'exception est interceptée et placée sur l'objet Task. Droite Pour les méthodes asynchrones void, il n'y a pas d'objet Task, donc toute exception levée par une méthode asynchrone void sera levée directement sur le void qui était actif lorsque la méthode asynchrone SynchronizationContext a été lancée.

De plus, utiliser

pour attendre la fin d'une tâche peut bloquer l'application si .NET décide d'exécuter la méthode de manière synchrone. Wait()

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