3

我有一个 perl 脚本,使用标准作为污垢的 Net::HTTP 代码和 perl 5.8.8。我遇到了一个错误情况,当我调用时服务器返回 0 字节的数据:

$_http_connection->read_response_headers;

不幸的是,我的 perl 脚本die,因为 Net::HTTP::Methods 模块在第 306 行有一个“死”:

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并随后进入我自己的错误处理代码,而不是dieing 本身?

我确信这是一个常见的情况,可能很简单,但我以前没有遇到过。

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

自定义dieto 意味着别的东西很简单:

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 回答