exit を捕まえる
昨日、exit しちゃうとテストコードで例外捕まえられないよー、と書きましたが、何とかする方法を見つけました。
exit を die で置き換えちゃえばいいんです。
use strict; use warnings; BEGIN { *CORE::GLOBAL::exit = sub() { die "exited\n"; }; } print "== START ==\n"; eval { mysub(); # exit しているけど、die に無理やり置き換えたので eval で捕まえられる }; print "\$@ : $@"; print "back to main\n"; print "== END ==\n"; sub mysub { print "in mysub\n"; exit; print "NOT REACHED\n"; }
実行するとこんな感じ。
% perl ~/a.pl == START == in mysub $@ : exited back to main == END ==
exit じゃないので、「back to main」が表示されてます。
ちなみに、BEGIN ブロックをコメントアウトすると、こんな感じ。
% perl ~/a.pl == START == in mysub
制御が戻らず、終了してしまいます。
「exit ステータスをチェックしたい」、とかはちょっとキツいのですが(それでもできないことはない)、テストコードでこれをすれば何とかなるのかなぁ、と思います。