2017-10-05 3 views

答えて

6

strictプラグマには、すべての変数を宣言することを必要とするsubs、およびvarsのカテゴリが含まれています。それらはコンパイル時にエラーです。これらのスタックトレースは、その行のソースコードから直接発生するため、有用ではありません。

refsは、参照として文字列を禁止します。ランタイムエラーです。スタックトレースは、その文字列がどこから来たのかを理解するのに役立ちます。

スタックトレースを取得する方法の1つは、use Carp::Always(またはコマンドラインフラグ:-MCarp::Always)です。これにより、すべてのエラーと警告にスタックトレースが追加されます。すべてのエラーがずっと長くなるので、これをデバッグのヘルプとしてのみ使用することをお勧めします。

サブルーチンが無効な引数を受け取っているという問題がある場合は、入力を検証する方が良いかもしれません。例えば:

use Carp; 

sub foo { 
    my ($ref) = @_; 

    # dies from the line where "foo()" was called 
    croak q(Argument "ref" must be a scalar reference) 
    unless ref $ref eq 'SCALAR' or ref $ref eq 'REF'; 

    do_something_with($$ref); 
} 

Perlのオプション-MCarp=verboseを添加することによりCarp(例えばcroak()またはconfess())がスタックトレースを強制することができるからの機能のいずれかを使用。

+3

'Carp :: cluck'と' Carp :: confess'は常にスタックトレースを出力します。 – mob

関連する問題