tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

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 ステータスをチェックしたい」、とかはちょっとキツいのですが(それでもできないことはない)、テストコードでこれをすれば何とかなるのかなぁ、と思います。