8

evalスクリプトまたはブロックが終了する原因となった例外の種類を確認するにはどうすればよいですか? エラーの種類と、例外が発生した場所を知る必要があります。

4

1 に答える 1

13

パールのやり方

慣用的な Perl では、すべてのエラーを無視するか、ログに記録するか別の場所に転送するためにそれらをキャプチャします。

eval { func() };  # ignore error

また:

eval { func() };
if ($@) {
    carp "Inner function failed: $@";
    do_something_with($@);
}

または ( Try::Tinyを使用- Perl の組み込みの例外処理で使用する理由については、そのページを参照してください):

try { func() }
catch {
     carp "Inner function failed: $_";
     do_something_with($_);
};

例外の種類を確認する場合は、正規表現を使用します。

if ( $@ =~ /open file "(.*?)" for reading:/ ) {
    # ...
}

行とファイルもその文字列に含まれています。

ただし、正確な文字列を知る必要があるため、これはかなり面倒です。本当に適切なエラー処理が必要な場合は、CPANの例外モジュールを使用してください。

例外::クラス

$@ は文字列である必要はなく、オブジェクトでもかまいません。Exception::Classを使用すると、例外オブジェクトを Java スタイルで宣言およびスローできます。エラーをスローするときに任意の情報 (ファイル名など) を渡して、正規表現解析ではなくオブジェクト メソッドを使用してその情報を取得できます (例外のファイル行番号を含む)。

Error::Exception を使用しないサードパーティ モジュールを使用している場合は、

$SIG{__DIE__} = sub { Exception::Class::Base->throw( error => join '', @_ ); };

これにより、すべてのエラーが Exception::Class オブジェクトに変換されます。

Error::Exceptionは、Exception::Class オブジェクトの適切な文字列化を設定します。

于 2010-03-01T10:21:11.140 に答える