Каков наилучший способ распространения ошибок из отдельного потока (например, начальный блок, Proc :: Async или подпункт, содержащий их). Простое завершение кода, который раскручивает новый поток в блоке try / CATCH, не работает, а использование await работает только в зависимости от возвращаемого значения подпрограммы (то есть подпрограмма, возвращающая self, не будет работать с подходом await).
9
foo
и здесьbar
можно устранить?Ответы:
Использование
await
.Например, замените эти три строки в вашем коде:
с:
источник
Теоретически этот код должен умереть :
В этом случае это странная ситуация, потому что вы не отказываетесь от обещания (вы его возвращаете), но в конечном итоге вы его опускаете, потому что запускаете его в пустом контексте.
Та же документация дает вам решение: не опускайте контекст:
Поскольку ваша программа не умирает, я бы сказал, что вы находитесь во второй ситуации. По какой-то причине он не затонул. Но как бы то ни было, решение остается тем же: вам нужно перехватить исключение внутри одного и того же блока кода.
Решение:
await
обещание (которое не поглотит его) или присвоение его некоторой переменной, чтобы окружающий код тоже погиб. Но, отвечая на ваш OP, нет, вы не можете перехватить исключение из другого потока, так же, как вы не можете перехватить исключение из другого блока.источник
Следуя соглашению, используемому в Go для передачи ошибок из подпрограмм go с использованием каналов, я нашел такой же подход к работе в Raku. Канал можно использовать для отправки ошибок из асинхронного кода, обрабатываемого основным потоком.
Пример:
источник