Théoriquement, ce code devrait mourir :
À partir de la version 6.d du langage, le préfixe d'instruction de début utilisé dans le contexte de récepteur attachera automatiquement un gestionnaire d'exceptions. Si une exception se produit dans le code donné, elle sera imprimée et le programme se fermera alors, comme si elle était levée sans aucun préfixe d'instruction de démarrage impliqué.
use v6.c;
start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
use v6.d;
start { die }; sleep ⅓; say "hello";
# OUTPUT:
# Unhandled exception in code scheduled on thread 4
# Died
# in block at -e line 1
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:
# Don't sink it:
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
# Catch yourself:
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";
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.
foo
- être etbar
peut être éliminé ici?