Теоретично цей код повинен загинути :
З версії 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
обіцянка (яка не затопить її) або призначте її якійсь змінній, щоб оточуючий код теж помер. Але, відповідаючи на ваш ОП, ні, ви не можете зловити виняток з іншого потоку, так само, як ви не можете вилучити виняток з іншого блоку.
foo
іbar
тут можна усунути?