web-dev-qa-db-ja.com

Rakuの別のスレッドでスローされたエラーをどのように伝播およびキャッチできますか?

別のスレッド(たとえば、開始ブロック、Proc :: Async、またはこれらを含むサブルーチン)からエラーを伝播する最良の方法は何ですか。新しいスレッドをスピンオフするコードをtry/CATCHブロックで単にラップするだけでは機能せず、awaitの使用は、サブルーチンの戻り値に応じてのみ機能します(つまり、subがselfを返すと、awaitアプローチでは機能しません)。

9
ryn1x

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;
4
ryn1x