2

私は理解できないような問題を抱えています。皆さんが私を助けてくれることを願っています。
問題は次の場合に発生します:

  • カスタムエラー処理を使用します
  • 別のモジュールでFile::Statを使用します

例:

メインファイル

use strict;
use warnings;

# signal handling
$SIG{__DIE__} = sub {
    my $error = @_;
    chomp $error;
    print "die: $error\n";
};

require mod; 

mod->get_stat();

モジュール

package mod;

use strict;
use warnings;
use File::stat;

sub get_stat {
    my $file_path = "test.txt";
    my $file_size = stat($file_path)->size;
    print $file_size;
}

1;

これにより、次の出力が発生します。

die: 1
die: 1
die: 1
die: 1
die: 1
4

これで、カスタムエラー処理を削除した場合、またはrequireの代わりにmodを使用した場合、ダイは表示されません。

興味深いのは、実際に結果が生成されることです(test.txtは4バイトです)。つまり、statは正常に機能しています。

では、なぜこのエラーが発生するのですか?これは本当にエラーですか?デフォルトのperlエラー処理は「1」のエラーを無視しますか?

編集
LinusKleenが述べたように、私が「1」を取得する理由は、配列内の要素の量を表示しているためです。

代わりにエラーの内容を印刷すると、次のエラーが発生します。

die: Your vendor has not defined Fcntl macro S_ISVTX, used at c:/Perl64/lib/File/stat.pm line 37.

die: Your vendor has not defined Fcntl macro S_IFSOCK, used at c:/Perl64/lib/File/stat.pm line 41.

die: Your vendor has not defined Fcntl macro S_IFBLK, used at c:/Perl64/lib/File/stat.pm line 41.

die: S_IFFIFO is not a valid Fcntl macro at c:/Perl64/lib/File/stat.pm line 41.

die: Your vendor has not defined Fcntl macro S_IFLNK, used at c:/Perl64/lib/File/stat.pm line 41.

4

しかし、それでも、カスタムエラー処理なしでは取得できないエラーが発生します。

4

2 に答える 2

7

perlvarで説明されているように、実装により、コードがeval内でダイされた場合でもグリッチ$SIG{__DIE__}フックが呼び出されます。File :: statがロードされると、Fcntlがプラットフォームでサポートしている定数を確認します。サポートされていない定数によって引き起こされたエラーをキャッチしますが、フックがそれらを認識する前にはキャッチしません。

evalの値を確認することで、に参加しているかどうかを確認できます$^S。0でない場合は、評価中です。

$SIG{__DIE__} = sub {
    return unless defined $^S and $^S == 0; # Ignore errors in eval
    my ($error) = @_;
    chomp $error;
    print "die: $error\n";
};

はコンパイル時の操作であり、実行時の操作であるため(設定の場合と同様)、useの代わりにエラーは表示されません。あなたとそれがFile::statの場合、フックを設定する前にすべてが発生します。あなたが、あなたがあなたのフックをインストールするまでそれは起こりません。requireuserequire%SIGuse moduserequire mod

于 2011-11-10T11:18:08.413 に答える
6

に変更します

my ($error) = @_;

コード例ではスカラーコンテキストを使用しています@_。これにより、の要素数が1になります。

于 2011-11-10T10:42:26.303 に答える