Qual é a melhor maneira de propagar erros a partir de um thread separado (por exemplo, bloco inicial, Proc :: Async ou sub contendo estes). Simplesmente encapsular o código que gera um novo encadeamento em um bloco try / CATCH não funciona, e o uso de aguardar funciona apenas dependendo do valor de retorno da sub-rotina (isto é, um sub-retorno não funcionará com a abordagem de espera).
9
foo
ebar
possa ser eliminado aqui?Respostas:
Use
await
.Por exemplo, substitua estas três linhas no seu código:
com:
fonte
Teoricamente, esse código deve morrer :
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:
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.fonte
Seguindo a convenção usada em Ir para passar rotinas fora de uso usando canais, encontrei a mesma abordagem para trabalhar em Raku. Pode-se usar um canal para enviar erros fora do código assíncrono a ser tratado pelo thread principal.
Exemplo:
fonte