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

发布于 2024-12-19 02:04:59 字数 669 浏览 1 评论 0原文

我有一个 perl 脚本,使用 standard-as-dirt Net::HTTP 代码和 perl 5.8.8。 我遇到了一个错误情况,当我调用时,服务器返回 0 字节数据:

$_http_connection->read_response_headers;

不幸的是,我的 Perl 脚本 dies,因为 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 dies, 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 dieing itself?

I'm sure this is a common case, and probably something simple, but I have not come across it before.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烟酉 2024-12-26 02:04:59

使用 eval 捕获异常 偶尔会出现问题,尤其是在 5.14 之前。您可以使用 Try::Tiny

Using eval to catch exceptions can occasionally be problematic, especially pre 5.14. You can use Try::Tiny.

吹梦到西洲 2024-12-26 02:04:59

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

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

请参阅 http://perldoc。 perl.org/functions/eval.html 了解详细信息。

You can use eval { } to catch die() exceptions. Use $@ to inspect the thrown value:

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

See http://perldoc.perl.org/functions/eval.html for details.

傲鸠 2024-12-26 02:04:59

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 解释器来执行有问题的代码。

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

Customizing the die to mean something else is simple:

sub custom_exception_handler { ... } # Define custom logic

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文