60

私は一般的に自分でロールしたので、Carpをあまり使用していません。ただし、コアモジュールを維持するという精神で、現在はそれを使用しています。ただし、warn/dieよりもかろうじて優れているようです。

さらに、cluck / confess / verboseは何をしますか?この短いスクリプトを実行して、出力が次のようになっていることを確認しました(Carpドキュメントでは実行されないため)。(ランダムな文字列を除いて)どの実行でもまったく同じように見えます。

  #!/usr/bin/perl

  package Warning;

  sub warning {
    warn "warn";
  }

  package CWarn;
  use Carp qw(carp cluck);

  sub cwarn {
    int(rand(2)) ? carp "carp" : cluck "cluck";
  }

  package Fatal;
  use Carp qw(confess croak);

  sub fatal {
    int(rand(2)) ? confess "confess" : croak "croak";
  }

  package Loop;

  use v5.10;

  sub loop {
    say '=' x 80;
    Warning::warning();
    CWarn::cwarn();
    loop() unless ($c++ > 10);
    Fatal::fatal();
  }

  package main;

  Warning::warning();
  CWarn::cwarn();
  Loop::loop();

更新:スクリプトをパッケージ名で更新しましたが、違いがあります。ただし、Carpはログ情報に関してはまだ非常に基本的であるように思われ、Web出力をサポートしていません。CGI :: Carp、Log :: Output、Log::Log4Perlのような他のものを見てみようと思います。

4

2 に答える 2

153

この例の問題は、すべての登録者が同じパッケージ(デフォルトのパッケージ:)に含まれていることですmainこれは、 Carpが設計されたユースケースではありません。

コイはモジュールで使用することを目的としています。その理由は、モジュールで問題が発生した場合、モジュールの呼び出し元が不良データを渡したことが原因であることが多いためです。したがって、モジュールが問題を発見した行を報告する代わりに、通常、モジュールが呼び出された行を報告する方が便利です(モジュール外のコードから)。これが、Carpによってエクスポートされた関数が行うことです。

はい/いいえオプションの2つのセットがあります。関数は、致命的(like die)または非致命的(like)の場合がありwarnます。関数が呼び出された行だけを報告することも、完全なバックトレースを報告することもできます。

         Fatal  Backtrace
carp       N        N
cluck      N        Y
croak      Y        N
confess    Y        Y

詳細オプションは、バックトレースを強制的にオンにします。つまり、のように動作し、carpのようcluckcroak動作しconfessます。より多くのデバッグ情報が必要であることに気付いたが、使用するコードを変更したくない場合は、これを使用できますconfess

于 2011-10-01T03:47:11.343 に答える
26

Carpは、単にエラーがスローされた場所ではなく、エラーをスローする関数と呼ばれるもののファイルと行を表示するという点で、warn / dieよりも優れています。これは多くの場合、ライブラリに役立ちます。(たとえば、データベースライブラリは、それ自体の中に行を示すのではなく、誤ったデータベース呼び出しがどこにあるかを示すエラーをスローする可能性があります。)

carp、、、およびオプションcluckの4つの組み合わせを提供します。croakconfess

  • carp:致命的ではなく、バックトレースなし
  • cluck:致命的ではなく、バックトレースあり
  • croak:致命的、バックトレースなし
  • confess:致命的、バックトレースあり
于 2011-10-01T03:18:21.493 に答える