Quelle est la meilleure façon de propager les erreurs à partir d'un thread séparé (par exemple, le bloc de démarrage, Proc :: Async ou un sous-conteneur les contenant). Le simple encapsulage du code qui dérive un nouveau thread dans un bloc try / CATCH ne fonctionne pas, et l'utilisation de l'attente ne fonctionne que selon la valeur de retour de la sous-routine (c'est-à-dire qu'un sous-retour ne fonctionnera pas avec l'approche de l'attente).
9
foo
- être etbar
peut être éliminé ici?Réponses:
Utilisez
await
.Par exemple, remplacez ces trois lignes dans votre code:
avec:
la source
Théoriquement, ce code devrait mourir :
Dans ce cas, c'est une situation étrange parce que vous ne perdez pas la promesse (vous la rendez), mais finalement vous la perdez parce que vous l'exécutez dans un contexte vide.
La même documentation vous donne la solution: ne coulez pas le contexte:
Puisque votre programme ne meurt pas, je dirais que vous êtes dans la deuxième situation. Pour une raison quelconque, ce n'est pas coulé. Mais quelle que soit la situation, la solution est la même: vous devez intercepter l'exception dans le même bloc de code.
Solution:
await
la promesse (qui ne la coulera pas) ou l'affecter à une variable, de sorte que le code environnant meurt aussi. Mais en répondant à votre OP, non, vous ne pouvez pas intercepter une exception d'un autre thread, de la même manière que vous ne pouvez pas intercepter une exception d'un autre bloc.la source
En suivant la convention utilisée dans Go pour passer les erreurs des routines go en utilisant des canaux, j'ai trouvé la même approche pour travailler dans Raku. On peut utiliser un canal pour envoyer des erreurs hors du code asynchrone à gérer par le thread principal.
Exemple:
la source