如果在它使用的模块中抛出异常,我怎么能阻止我的perl脚本终止?

Jos*_*osh 3 perl exception-handling die

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

$_http_connection->read_response_headers;
Run Code Online (Sandbox Code Playgroud)

不幸的是,我的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
Run Code Online (Sandbox Code Playgroud)

当然,第305-307行是:

unless (defined $status) {
die "Server closed connection without sending any data back";
}
Run Code Online (Sandbox Code Playgroud)

如何让我的脚本"从这种情况中优雅地恢复",检测die并随后进入我自己的错误处理代码,而不是die自己?

我敢肯定这是一个常见的情况,可能是一些简单的事情,但我之前没有遇到过.

Sin*_*nür 12

使用eval来捕获异常有时可能会出现问题,尤其是在5.14之前.你可以使用Try :: Tiny.

  • 如果你可以在该系统上放置一个脚本,你也可以在该系统上使用`Try :: Tiny`,即使你只是复制& 将模块源代码粘贴到脚本中. (4认同)

npo*_*cop 11

您可以eval { }用来捕获die()异常.使用$@检查抛出值:

eval {
    die "foo";
};
print "the block died with $@" if $@;
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见http://perldoc.perl.org/functions/eval.html.