5

Carp モジュールのドキュメントによると、true と評価されcroak()ない限り、スタック トレースを生成するべきではありません。$Carp::Verboseしかし、何らかの理由で、croak()常に私の環境のようconfess()に動作します。つまり、スタックトレースを出力すべきでない場合でも常に出力します..

テストスクリプトは次のとおりです。

#!/usr/bin/perl

use Modern::Perl;
use Carp;

sub func
{
    say "Carp::Verbose = $Carp::Verbose";
    croak "There should be no stack trace after this message!";
}

sub main
{
    func();
}

main;

そして、これが私のシステムで生成される結果です。

$ ./croak
Carp::Verbose = 0
There should be no stack trace after this message! at ./croak line 8
    main::func() called at ./croak line 13
    main::main() called at ./croak line 16

誰かがこの問題に遭遇したか、根本的な原因についての手がかりを持っているのでしょうか?

ここに私の環境に関するいくつかの情報があります:

Ubuntu 12.04 LTS
Linux 3.2.0-27-generic x86_64
perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi

また、SL6 システムでも同じように間違った動作をします。

Scientific Linux SL release 6.3 (Carbon)
kernel-2.6.32-279.1.1.el6.x86_64
perl, v5.10.1 (*) built for x86_64-linux-thread-multi
4

2 に答える 2

5

Carpエラー メッセージに使用するスタック トレースのフレームに関する の規則の1 つは、次のとおりです。

  1. パッケージからそれ自体への呼び出しは安全です。

あなたのコードは 以外のパッケージを使用しておらず、パッケージ自体は安全でmainあるという別のルールがあるため、エラー メッセージに使用するコード行を決定できないため、スタック トレース全体をパントして出力します。CarpCarp

ああ、それは実際にCarpperldoc にあります:

彼らがしていることは、エラーがあってはならないと言われていなかった関数呼び出しスタックを呼び出しスタックで検索することです。すべての呼び出しが安全であるとマークされている場合、それらは放棄され、代わりに完全なスタック バックトレースが提供されます。

Carp::short_error_loc関数内の次の行が決定的な武器です。

return 0 unless defined($caller);    # What happened?
于 2012-08-09T16:04:26.873 に答える
3

半分の答え: コードがすべて同じパッケージに含まれていることに関係があります。別のパッケージからエントリ ポイントを呼び出すと、croak期待どおりに動作します。

于 2012-08-09T11:16:31.593 に答える