Teoricamente, quel codice dovrebbe morire :
A partire dalla versione 6.d della lingua, il prefisso dell'istruzione start utilizzato nel contesto del sink collegherà automaticamente un gestore di eccezioni. Se si verifica un'eccezione nel codice specificato, verrà stampata e il programma verrà quindi chiuso, come se fosse stato lanciato senza alcun prefisso dell'istruzione start coinvolto.
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
In questo caso è una situazione strana perché non stai sprofondando la promessa (la stai restituendo), ma alla fine la affondi perché la stai eseguendo in un contesto vuoto.
La stessa documentazione ti offre la soluzione: non affondare il contesto:
# Don't sink it:
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
# Catch yourself:
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";
Dal momento che il tuo programma non muore, direi che sei nella seconda situazione. Per qualche motivo, non è affondato. Ma qualunque sia la situazione, la soluzione è la stessa: è necessario intercettare l'eccezione all'interno dello stesso blocco di codice.
Soluzione: await
la promessa (che non la affonderà) o assegnarla a qualche variabile, in modo che anche il codice circostante muoia. Ma rispondendo al tuo OP, no, non puoi prendere un'eccezione da un altro thread, allo stesso modo non puoi prendere un'eccezione da un altro blocco.
foo
ebar
può essere eliminato qui?