如果 Perl 脚本使用的模块中抛出异常,如何防止它终止?
我有一个 perl 脚本,使用 standard-as-dirt Net::HTTP 代码和 perl 5.8.8。 我遇到了一个错误情况,当我调用时,服务器返回 0 字节数据:
$_http_connection->read_response_headers;
不幸的是,我的 Perl 脚本 die
s,因为 Net::HTTP::Methods 模块有一个“die”第 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
并随后进入我自己的错误处理代码,而不是的自己死去
?
我确信这是一个常见的情况,而且可能很简单,但我以前没有遇到过。
I have a perl script, using standard-as-dirt Net::HTTP code, and perl 5.8.8.
I have come across an error condition in which the server returns 0 bytes of data when I call:
$_http_connection->read_response_headers;
Unfortunately, my perl script die
s, because the Net::HTTP::Methods module has a "die" on line 306:
Server closed connection without sending any data back at
/usr/lib/perl5/vendor_perl/5.8.8/Net/HTTP/Methods.pm line 306
And lines 305-307 are, of course:
unless (defined $status) {
die "Server closed connection without sending any data back";
}
How can I have my script "recover gracefully" from this situation, detecting the die
and subsequently going into my own error-handling code, instead of die
ing itself?
I'm sure this is a common case, and probably something simple, but I have not come across it before.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用 eval 捕获异常 偶尔会出现问题,尤其是在 5.14 之前。您可以使用 Try::Tiny。
Using eval to catch exceptions can occasionally be problematic, especially pre 5.14. You can use Try::Tiny.
您可以使用
eval { }
捕获die()
异常。使用$@
检查抛出的值:请参阅 http://perldoc。 perl.org/functions/eval.html 了解详细信息。
You can use
eval { }
to catchdie()
exceptions. Use$@
to inspect the thrown value:See http://perldoc.perl.org/functions/eval.html for details.
将
die
自定义为其他含义很简单:与
eval
相比,这种方法的一大优点是它不需要调用另一个 perl 解释器来执行有问题的代码。当然,自定义异常处理程序应该足以完成手头的任务。
Customizing the
die
to mean something else is simple:The big advantage of this approach over
eval
is that it doesn't require calling another perl interpreter to execute the problematic code.Of course, the custom exception handler should be adequate for the task at hand.