web-dev-qa-db-ja.com

Carp / Croak、Cluck / Confess、および冗長オプションの違いは何ですか?

私は一般的に自分自身を転がしたので、私はCarpをあまり使いませんでした。ただし、Coreモジュールを維持するという精神で、私は今それを使用しています。ただし、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();

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

52
Brendan Byrd

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

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

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

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

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

137
cjm

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

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

  • carp:致命的ではなく、バックトレースなし
  • cluck:致命的ではなく、バックトレースあり
  • croak:致命的、バックトレースなし
  • confess:致命的、バックトレースあり
24
duskwuff