3

Logger モジュール内で以下のように SIG ダイ ハンドラーをオーバーライドしています。

# Catch die messages and log them with logdie
$SIG{__DIE__} = \&logdie;

以下のプログラムは期待どおりに実行され、後処理が呼び出されます。

use strict;
use warnings;
use File::Path;
# use MyLogger;

my $dir="/random";
eval {
  # local $SIG{__DIE__};
  File::Path::make_path($dir);
};
if($@) {
 warn("Cannot create $dir :$@ \n");
}
print "Post processing \n";

ただし、ロガーモジュールを含めてuse MyLoggerコードを追加するevalと、以下のエラーでステートメント内で失敗し、後処理が呼び出されません。

[エラー] 2015/04/27 22:19:07 Carp.pm:166> mkdir /random: ./test.pl 行 11 で許可が拒否されました。

これを修正してローカル sigdie ハンドルを追加するオプションの 1 つ (コメント付きのコードを参照)。

ただし、私のロガー モジュールは多くのスクリプトで使用されています。

ロガー モジュールを変更して、eval ブロッ​​ク内から呼び出されたときに ERROR メッセージを抑制する方法はありますか?

4

1 に答える 1

7

$^S、現在の実行ポイントがevalブロック内にあるかどうかを示します。

$^S         State
---------   -------------------------------------
undef       Parsing module, eval, or main program
true (1)    Executing an eval
false (0)   Otherwise

したがって、ハンドラー$^Sの先頭で が trueかどうかを確認したいようです。__DIE__

package MyLogger;
sub logdie {
    $^S && die $_[0];    # use default die handler
    ...                  # else use custom die handler
}
于 2015-04-28T02:42:33.257 に答える