Teoricamente, esse código deve morrer :
A partir da versão 6.d do idioma, o prefixo da instrução start usado no contexto do coletor anexará automaticamente um manipulador de exceções. Se ocorrer uma exceção no código fornecido, ele será impresso e o programa será encerrado, como se fosse lançado sem nenhum prefixo de instrução de início envolvido.
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
Nesse caso, é uma situação estranha, porque você não está cumprindo a promessa (está retornando), mas eventualmente a afunda porque a executa em um contexto nulo.
A mesma documentação fornece a solução: não afunde o 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 seu programa não morre, eu diria que você está na segunda situação. Por alguma razão, não está afundado. Seja qual for a situação, a solução é a mesma: você precisa capturar a exceção dentro do mesmo bloco de código.
Solução: await
a promessa (que não afunda) ou a atribui a alguma variável, para que o código circundante morra também. Mas, respondendo ao seu OP, não, você não pode capturar uma exceção de outro encadeamento, da mesma forma que não pode capturar uma exceção de outro bloco.
foo
ebar
possa ser eliminado aqui?