2011-11-10 10 views
2

正常に表示されないエラーをキャッチされました。
時に問題が発生します。カスタムエラー処理は、私が把握することができないよう、私はあなたたちが私を助けることを願って、問題が生じています

メインファイル

use strict; 
use warnings; 

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

require mod; 

mod->get_stat(); 

私が使用

  • がカスタム私は別々のモジュールで

例をファイル::スタットを使用し

  • をerrorhandling

    モジュール私はOR私のカスタムエラー処理を削除した場合、私は代わりに MODを使用場合、ダイのは表示されませんを必要とし、今

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

    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; 
    
    これは、次のような出力が発生します。

    見るのは興味深いが、それはが実際にそれを必要としてSTATが作動している意味、(test.txtの4バイト)結果を生成ないことです。

    だから、なぜ私はこのエラーを取得していますか?これは本当にエラーですか?デフォルトのperlエラー処理は "1"のエラーを無視しますか?

    EDIT
    ライナスKleenがで述べたよう
    、私は、配列内の要素の量を表示していますので、「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 
    

    しかし、それでもまだ、私は、カスタムのエラー処理なしで、私は得ることはありません、というエラーを取得しています。 1である@_にあなたの要素の数を与えるあなたは、あなたのコード例では、スカラーコンテキストを使用している

    my ($error) = @_; 
    

  • +0

    あなたのパッケージから最後の実行可能な文を返す必要があります – run

    +0

    ああ...そうですね、WindowsでPerlを実行していますか?どちらですか? –

    +0

    Windows 7 with ActivePerl 5.12 – Pmarcoen

    答えて

    6

    としては$SIG{__DIE__}フックが呼び出されるため、実装上の不具合に対して、perlvarで説明しても、eval内部のコードがdie秒。 File::statがロードされると、それはあなたのプラットフォーム上でFcntlサポート定数かを確認するチェックします。サポートされていない定数によって引き起こされるエラーをキャッチしますが、フックが表示される前にエラーを検出しません。

    あなたが$^Sの値をチェックすることにより、evalにいる場合は、伝えることができます。それが0でなければ、あなたは評価に入っています。

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

    ときuse代わりのrequireuseは、コンパイル時の操作であり、requireは(%SIGを設定しているなど)、実行時の動作であるので、あなたは、エラーが表示されません。 use modとそれがuseのときFile :: stat、すべてが起こるの前にあなたのフックを設定します。 require modの場合は、までの後には発生しません。

    +0

    すばらしい答え、ありがとう! – Pmarcoen

    6

    変更して、。

    +0

    正解、ありがとうございます。しかし、私はカスタムエラー処理なしでは、私は得られないというエラーが発生しています。 – Pmarcoen

    関連する問題