如果在perl脚本使用的模块中抛出异常,如何防止perl脚本终止?

如果在perl脚本使用的模块中抛出异常,如何防止perl脚本终止?,perl,exception-handling,die,Perl,Exception Handling,Die,我有一个perl脚本,使用标准as Net::HTTP代码和perl 5.8.8。 我遇到了一个错误情况,在这种情况下,当我调用时,服务器返回0字节的数据: $_http_connection->read_response_headers; 不幸的是,我的perl脚本dies,因为Net::HTTP::Methods模块在第306行有一个“die”: Server closed connection without sending any data back at /usr/lib/pe

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

$_http_connection->read_response_headers;
不幸的是,我的perl脚本
die
s,因为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
ing本身


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

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

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

有关详细信息,请参阅。

用于捕获异常,尤其是5.14之前的版本。您可以使用。

自定义
模具
来表示其他简单的事情:

sub custom_exception_handler { ... } # Define custom logic

local $SIG{__DIE__} = \&custom_exception_handler;  # Won't die now
# Calls custom_exception_handler instead
eval
相比,这种方法的最大优点是不需要调用另一个perl解释器来执行有问题的代码


当然,自定义异常处理程序应该足以完成手头的任务。

我无法在此系统上安装模块,而且这是我试图解决的一个罕见问题,因此“eval”现在必须解决,但对于其他项目,我会记住Try::Tiny。谢谢。如果您可以在该系统上放置脚本,您也可以在该系统上使用
Try::Tiny
,即使您只是复制&;将模块源代码粘贴到您的脚本中。从技术上讲,这是肯定的,但这并不值得付出努力,因为使用这个小小的内部脚本将解决大量的问题。即使它因Net::HTTP问题而消亡,也只是我们在消亡之前是否记录问题的问题。如果我们错过了,那不是世界末日。:)在Perl5.14之前,
eval
最好写成
my$success=eval{code\u that_may_die();1;};如果(!$success){print“Error:$@”}
这是由于退出
eval
块时,
$@
的值可能会被清除这一相当罕见的问题造成的。从5.14开始,任何一种方式都有效。