別のスレッド(たとえば、開始ブロック、Proc :: Async、またはこれらを含むサブルーチン)からエラーを伝播する最良の方法は何ですか。新しいスレッドをスピンオフするコードをtry/CATCHブロックで単にラップするだけでは機能せず、awaitの使用は、サブルーチンの戻り値に応じてのみ機能します(つまり、subがselfを返すと、awaitアプローチでは機能しません)。
Goで使用されている規則に従って、チャネルを使用してgoルーチンからエラーを渡すと、Rakuでも同じアプローチが機能することがわかりました。 Channelを使用して、非同期コードからエラーを送信し、メインスレッドで処理できます。
例:
my $errors = Channel.new;
my $err-supply = $errors.Supply;
$err-supply.tap(-> $e {say "handle error: $e"});
start {
die "something went horribly wrong";
CATCH {
default {
$errors.send($_);
}
}
}
sleep 1;