26

人々は警告の代わりにコイの例を私に与え続けます。なんで?コイが警告より優れている理由は何ですか?

4

4 に答える 4

41

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

この小さなプログラムにはちょっとばかげていますが、カープしているメソッドを誰が呼び出したかを知りたい場合に便利です。

于 2008-10-09T19:16:43.327 に答える
23

warnはスクリプトや単純なプログラム、およびCarp任意のモジュール内で使用します。サブルーチンは、現在のCarpサブルーチンが呼び出されたファイル名と行番号を使用するため、問題の原因を簡単に見つけることができます(問題が発生した場所だけでなく)。

Damianは、 Perl Best Practicesの「ReportingFailure」Carpの代わりに推奨していますが、トップレベルのコード構造としてのスクリプトと、プログラムが使用するコンポーネントとしてのモジュールを区別していません。warn

Log :: Log4perlを使用してすべてを処理しているため、最近はほとんど気にしません。

于 2008-10-09T19:35:40.870 に答える
12

carp は、モジュール内でのデバッグに適しています。単純なスクリプトしか書いていない場合、メリットはありません。鯉のドキュメントから:

Carp ルーチンは、die() または warn() のように機能するため、独自のモジュールで役立ちますが、モジュールのユーザーに役立つ可能性が高いメッセージが表示されます。cluck、concept、longmess の場合、そのコンテキストは呼び出しスタック内のすべての呼び出しの要約です。より短いメッセージの場合は、モジュールが呼び出された場所からエラーを報告する carp または croak を使用できます。そこにエラーがあったという保証はありませんが、十分な知識に基づいた推測です。

于 2008-10-09T19:14:02.393 に答える
8

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.

于 2008-10-09T19:51:56.967 に答える