3

standard-as-dirt Net::HTTP コードと perl 5.8.8 を使用した perl スクリプトがあります。次の呼び出し時にサーバーが 0 バイトのデータを返すというエラー状態に遭遇しました。

$_http_connection->read_response_headers;

残念ながら、私の perl スクリプトdieは、Net::HTTP::Methods モジュールの 306 行目に「die」があるためです。

Server closed connection without sending any data back at
/usr/lib/perl5/vendor_perl/5.8.8/Net/HTTP/Methods.pm line 306

そして305-307行目はもちろん:

unless (defined $status) {
die "Server closed connection without sending any data back";
}

スクリプトをこの状況から「正常に回復」させて、それ自体を検出するのdieではなく、独自のエラー処理コードに移行するにはどうすればよいdieですか?

これは一般的なケースであり、おそらく単純なものだと確信していますが、これまでに遭遇したことはありません。

4

3 に答える 3

12

evalを使用して例外をキャッチすると、特に 5.14 より前で問題が発生することがあります。Try::Tinyを使用できます。

于 2011-12-01T16:23:58.853 に答える
11

例外eval { }をキャッチするために使用できます。スローされた値を検査するためにdie()使用します。$@

eval {
    die "foo";
};
print "the block died with $@" if $@;

詳細については、 http://perldoc.perl.org/functions/eval.htmlを参照してください。

于 2011-12-01T16:15:30.940 に答える
2

die他の何かを意味するようにをカスタマイズするのは簡単です。

sub custom_exception_handler { ... } # Define custom logic

local $SIG{__DIE__} = \&custom_exception_handler;  # Won't die now
# Calls custom_exception_handler instead

このアプローチの大きな利点は eval、問題のあるコードを実行するために別のperlインタープリターを呼び出す必要がないことです。

もちろん、カスタム例外ハンドラーは、目前のタスクに適している必要があります。

于 2011-12-01T19:48:13.930 に答える