5.8.0 > carp

名前

carp - エラーの警告 (呼び出し元の観点から)

cluck - スタックバックトレースを伴うエラーの警告 (デフォルトではエクスポートされません)

croak - エラーを出してdieします (呼び出し元の観点から)

confess - スタックバックトレースを伴ってdieします

shortmess - carpとcroakが生成するメッセージを返します

longmess - cluckとconfessが生成するメッセージを返します

概要

    use Carp;
    croak "We're outta here!";

    use Carp qw(cluck);
    cluck "This is how we got here!";

    print FH Carp::shortmess("This will have caller's details added");
    print FH Carp::longmess("This will have stack backtrace added");

説明

Carpルーチンはdie()やwarn()のように振る舞うため、モジュールで用いる際に 便利です。しかし、それに伴うメッセージはあなたのモジュールにおける ユーザーにとってより便利なものとなりそうです。cluck、confess及び logmessではその背景にコールスタック内の全ての呼び出しに関する要約が 存在します。より短いメッセージを排出するためにはcarp、croakもしくは shortmessを使うことによって、モジュールが呼び出された位置から エラーをリポートすることが可能です。本ルーチンはエラーメッセージが どこで発生したかを保証するものではありませんが、優れた推測機能を提供します。

ここにはshortmessにおける動作原理についての完全な説明があります。行われるのは エラーが存在しないことを伝えていない関数コールスタックの検索です。もし全ての 呼び出しが安全であるとマークされているならば、その動作をやめ、代わりにフルス タックバックトレースを提供します。言い替えれば真っ先にエラーが起きそうだと 疑うことは罪なことであると考えるのです。呼び出しがエラーを生成するべきでない と判断するルールの内容を下記に示します:

  1. いかなるパッケージからもそれ自身に対しては安全とします。

  2. パッケージはその呼び出し上で、あるいはパッケージが@CARP_NOT又は (もしその配列が空ならば)@ISAに含まれ、明らかに安全なものとしてマークされて いるパッケージ上でエラーが存在しないであろうことを主張します。 5.8では@ISAによってオーバーライドする機能が新しくなっています。

  3. アイテム2における信頼は推移的です。もしAがBを信頼し、BがCを信頼するならば、 AはCを信頼するのです。よってもしあなたが@CARP_NOTとともに@ISAをオーバーライド しなければ、この信頼関係が"継承された"と言えるのです。

  4. いかなる内部のPerlモジュールからの呼び出しも安全です。(ユーザーモジュールに Perl内部のものであるとして自分自身をマークしないようにすることはしません。 この事実はがっかりさせるものであります。)

  5. Carpに対するどんな呼び出しも安全です。(これはcarp/croak/shortmessを 呼び出した箇所のエラーをリポートさせないようにするルールです。)

スタックトレースの強制

デバッグを行う目的で、あなたは全てのモジュールに渡ってCarpに croakをconfessとして、carpをcluckとして扱うよう強制することが 可能です。言い替えれば、より詳細なスタックトレースを提供するよう 強制するのです。これは何故、あるいはどこから警告又はエラーが 生成されるのかを知ろうとする際大きな助けとなり得るのです。

この特色はシンボル'verbose'を'インポート'することで使用可能となります。 一般的には次のように宣言することで可能になります。

    perl -MCarp=verbose script.pl

あるいは環境変数PERL50PTにMCarp=verboseを含めることでも可能になります。

バグ

Carpルーチンは今のところexceptionオブジェクトをハンドルしていません。 もし最初の引数がリファレンスであれば、単純にdie()あるいはwarn()を 適切に呼び出します。

翻訳者

三浦真磁 <snj@users.sourceforge.jp>