Teóricamente, ese código debería morir :
A partir de la versión 6.d del lenguaje, el prefijo de instrucción de inicio utilizado en el contexto de sumidero adjuntará automáticamente un controlador de excepciones. Si se produce una excepción en el código dado, se imprimirá y el programa se cerrará, como si se lanzara sin ningún prefijo de declaración de inicio involucrado.
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
En este caso, es una situación extraña porque no estás cumpliendo la promesa (la estás devolviendo), pero eventualmente la hundes porque la estás ejecutando en un contexto vacío.
La misma documentación le brinda la solución: no hunda el contexto:
# Don't sink it:
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
# Catch yourself:
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";
Como su programa no muere, diría que está en la segunda situación. Por alguna razón, no está hundido. Pero sea cual sea la situación, la solución es la misma: debe detectar la excepción dentro del mismo bloque de código.
Solución: await
la promesa (que no lo hundirá) o la asignará a alguna variable, de modo que el código circundante también muera. Pero respondiendo su OP, no, no puede detectar una excepción de otro hilo, de la misma manera que no puede detectar una excepción de otro bloque.
foo
ybar
puede ser eliminado aquí?