読者です 読者をやめる 読者になる 読者になる

rakugakibox.net

技術ノート。兼JS/CSS実験場。 ♡:Java, Spring, AWS.

Perlに挑戦したらエラー発生しないのにcatchブロックまで動いてはまった

Illust by はてなココ

最近はPerlスクリプトが割と使われている環境に居ます。
どちらかと言うとRubyistだったけど、
折角なのでPerlな世界にも飛び込んでみました。
…で早速はまったのでメモメモ。

try-catchを書いてみた

既存のコードをコピーしてtry-catchを書いたところ、
正常な処理なのにcatchの中まで動いてはまりました。

try {
    print "try\n";
} catch {
    print "catch\n";  # ここも動く
}

Perlではtry-catch構文はない

既存コードのtry-catchを見て、言語仕様として
例外処理の仕組みがあると思い込んだのが敗因でした。

Perlではtry-catch構文がないようで、
既存コードではライブラリ Try::Tiny が頑張っているとのこと。

で、今回catchまで動いてしまったのはuse Try::Tinyをしていなかったから。
こんな感じのエラーも出ていたけど、他のログに埋もれて見落としてたorz

Can't call method "catch" without a package or object reference at - line 3.

Try::Tinyの仕組み

Try::Tinyの仕組みは少し考えれば予想はついたし、ググれば出てきた。
こんな括弧やsubが省略されてるんだろうな。

use Try::Tiny;
try (
    sub { print "try\n"; },
    catch ( sub { print "catch\n"; } )
);