私は一般的に自分自身を転がしたので、私は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のような他のものを見ると思います。
この例の問題は、すべての潜水艦が同じパッケージ(デフォルトパッケージ:main
)にあることです。 Carp が設計されたユースケースではありません。
Carpはモジュールで使用することを目的としています。その理由は、モジュールで問題が発生した場合、モジュールの呼び出し元が不良データを渡したことが原因であることが多いためです。したがって、モジュールが問題を発見した行を報告する代わりに、モジュールが呼び出された行を(モジュールの外部のコードから)報告する方が通常便利です。それがCarpによってエクスポートされた関数が行うことです。
Yes/noオプションには2セットあります。関数は致命的( die
など)または致命的ではない( warn
など)ことができます。関数が呼び出された行だけを報告することも、完全なバックトレースを報告することもできます。
Fatal Backtrace
carp N N
cluck N Y
croak Y N
confess Y Y
詳細オプションは、バックトレースを強制的にオンにします。つまり、carp
はcluck
のように動作し、croak
はconfess
のように動作します。より多くのデバッグ情報が必要であることに気付いたときに使用できますが、confess
を使用するようにコードを変更したくない場合があります。
Carp
は、単にエラーがスローされた場所ではなく、エラーをスローした関数を呼び出したファイルと行を表示するという点で、warn
/die
よりも優れています。これは多くの場合、ライブラリに役立ちます。 (たとえば、データベースライブラリは、それ自体の行を示すのではなく、エラーのあるデータベース呼び出しの場所を示すエラーをスローする必要があります。)
carp
、cluck
、croak
、およびconfess
は、オプションの4つの組み合わせを提供します。
carp
:致命的ではなく、バックトレースなしcluck
:致命的ではなく、バックトレースありcroak
:致命的、バックトレースなしconfess
:致命的、バックトレースあり