¿Cuál es la mejor manera de propagar errores desde un hilo separado (por ejemplo, bloque de inicio, Proc :: Async o subcontenido que los contiene)? Simplemente envolver el código que hace girar un nuevo hilo en un bloque try / CATCH no funciona, y el uso de esperar solo funciona dependiendo del valor de retorno de la subrutina (es decir, un auto de retorno secundario no funcionará con el enfoque de espera).
9
foo
ybar
puede ser eliminado aquí?Respuestas:
Uso
await
.Por ejemplo, reemplace estas tres líneas en su código:
con:
fuente
Teóricamente, ese código debería morir :
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:
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.fuente
Siguiendo la convención utilizada en Go para pasar errores fuera de las rutinas de go usando canales, encontré el mismo enfoque para trabajar en Raku. Se puede usar un canal para enviar errores fuera del código asincrónico que debe manejar el hilo principal.
Ejemplo:
fuente