人々は警告の代わりにコイの例を私に与え続けます。なんで?コイが警告より優れている理由は何ですか?
4 に答える
carp は、メッセージの送信元 (コンテキスト) に関する詳細情報を提供します。
#!/usr/bin/perl
use Carp;
foo();
bar();
baz();
sub foo {
warn "foo";
}
sub bar {
carp "bar";
}
sub baz {
foo();
bar();
}
生産する
foo at ./foo.pl line 9.
bar at ./foo.pl line 13
main::bar() called at ./foo.pl line 6
foo at ./foo.pl line 10.
bar at ./foo.pl line 14
main::bar() called at ./foo.pl line 19
main::baz() called at ./foo.pl line 7
この小さなプログラムにはちょっとばかげていますが、カープしているメソッドを誰が呼び出したかを知りたい場合に便利です。
私warn
はスクリプトや単純なプログラム、およびCarp
任意のモジュール内で使用します。サブルーチンは、現在のCarp
サブルーチンが呼び出されたファイル名と行番号を使用するため、問題の原因を簡単に見つけることができます(問題が発生した場所だけでなく)。
Damianは、 Perl Best Practicesの「ReportingFailure」Carp
の代わりに推奨していますが、トップレベルのコード構造としてのスクリプトと、プログラムが使用するコンポーネントとしてのモジュールを区別していません。warn
Log :: Log4perlを使用してすべてを処理しているため、最近はほとんど気にしません。
carp は、モジュール内でのデバッグに適しています。単純なスクリプトしか書いていない場合、メリットはありません。鯉のドキュメントから:
Carp ルーチンは、die() または warn() のように機能するため、独自のモジュールで役立ちますが、モジュールのユーザーに役立つ可能性が高いメッセージが表示されます。cluck、concept、longmess の場合、そのコンテキストは呼び出しスタック内のすべての呼び出しの要約です。より短いメッセージの場合は、モジュールが呼び出された場所からエラーを報告する carp または croak を使用できます。そこにエラーがあったという保証はありませんが、十分な知識に基づいた推測です。
Carp
reports errors from the caller's perspective. This is useful for modules where you typically want to warn about incorrect usage (e.g. a missing argument) and identify the place where the error occurred as opposed to where it was detected. This is especially important for utility functions that might be used in many places.
Most authors use warn
in scripts and carp
in modules. Occasionally I use warn
inside a module when I want the error message to reflect a problem in the module's implementation (e.g. a case that it should support but doesn't.) It's arguable that cluck
would be better in such situations as it provides a full stack backtrace.