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 ?
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 :
De plus, utiliserLes 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 asynchroneTask
ou asyncTask<T>
, l'exception est interceptée et placée sur l'objetTask
. Droite Pour les méthodes asynchronesvoid
, il n'y a pas d'objetTask
, donc toute exception levée par une méthode asynchronevoid
sera levée directement sur levoid
qui était actif lorsque la méthode asynchroneSynchronizationContext
a été lancée.
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!