Теоретически этот код должен умереть :
Начиная с версии 6.d язык, префикс оператора start, используемый в контексте приемника, автоматически присоединяет обработчик исключений. Если в данном коде возникает исключение, оно будет напечатано, и программа завершит работу, как если бы оно было выдано без использования префиксов оператора start.
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
В этом случае это странная ситуация, потому что вы не отказываетесь от обещания (вы его возвращаете), но в конечном итоге вы его опускаете, потому что запускаете его в пустом контексте.
Та же документация дает вам решение: не опускайте контекст:
# Don't sink it:
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
# Catch yourself:
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";
Поскольку ваша программа не умирает, я бы сказал, что вы находитесь во второй ситуации. По какой-то причине он не затонул. Но как бы то ни было, решение остается тем же: вам нужно перехватить исключение внутри одного и того же блока кода.
Решение: await
обещание (которое не поглотит его) или присвоение его некоторой переменной, чтобы окружающий код тоже погиб. Но, отвечая на ваш OP, нет, вы не можете перехватить исключение из другого потока, так же, как вы не можете перехватить исключение из другого блока.
foo
и здесьbar
можно устранить?