第43回 dieをイバってdieさせない

warnを使えば、警告だけでて、プログラムが終了しないのをみてきましたが、

誰かが作った関数の中で、 die されていたらおしまいです。
これは、まいりますねー。

use strict;

# だれかが作った関数ということにする
sub hoge {
  print '僕が作ったよ この関数は必須ね', "\n";
  die 'うわぁああああ';
}

print 'プログラムスタート あの関数使わないと', "\n";

hoge();

print 'ここまできておねがい', "\n";

結果:

プログラムスタート あの関数使わないと
僕が作ったよ この関数は必須ね
うわぁああああ at bingo.pl line 6.

そんなときは eval

そんなときは eval を思い出しましょう。
第39回 evalを学習しよう part2 - bingo_nakanishiの他言語出身者のためのPerl入門


evalを使えば、dieも捕まえてくれまーす。 はい拍手〜〜〜〜 パチパチパチ
簡単な例から見ていきたいと思います。

use strict;

eval{
  print 'プログラムスタート', "\n";
  die 'うわあぁあああああぁあ', "\n";
  print 'ここは処理されないんですね 悲しい', "\n";
};

print 'ここまでこれるかな', "\n";

結果:

プログラムスタート
ここまでこれるかな

ほら、この通り、 die しても、処理は続行可能です。


あれあれ? でも、 dieの

'うわあぁあああああぁあ', "\n";

という部分が表示されていませんね。

$@

'うわあぁあああああぁあ', "\n";

の部分を表示させたければ、$@ という特殊変数を使います。
これは、 eval がなにを捕まえたのが入っています。

use strict;

eval{
  print 'プログラムスタート', "\n";
  die 'うわあぁあああああぁあ', "\n";
  print 'ここは処理されないんですね 悲しい', "\n";
};


print "$@";  # $@ を表示
print 'ここまでこれるかな', "\n";

結果:

プログラムスタート
うわあぁあああああぁあ
ここまでこれるかな

evalは呼び出した関数内の die も捕まえる

話を始めのほうにもどして、
誰かが作った関数の中でdieされていたときの対処法をお教えしましょう。
evalは、呼び出した関数内のdieも捕まえることができますので、以下のようにしてやればよいです。

use strict;

# だれかが作った関数ということにする
sub hoge {
  print '僕が作ったよ この関数は必須ね', "\n";
  die 'うわぁああああ';
}

print 'プログラムスタート あの関数使わないと', "\n";

eval {
  hoge();
};

print 'ここまできておねがい', "\n";

結果:

プログラムスタート あの関数使わないと
僕が作ったよ この関数は必須ね
ここまできておねがい

まとめ

evalを使えば、 die でプログラムを終了させないことが可能です。
しかし、単にプログラムが終了するのはなんか嫌だという理由でevalを使ってはいけません。
明確な理由をもって、そこでプログラムが終了しなくても問題はない場合に使うべきです。
もっと話を進めると、$@を使って処理をわけて例外処理をするべきなのです。その話はまた次回。


それでは また〜