【问题标题】:Is it possible to catch die messages that happen inside another perl module?是否可以捕获另一个 perl 模块中发生的消息?
【发布时间】:2012-07-04 06:01:34
【问题描述】:

我有一个用 Perl 编写的 SOAP 客户端,使用 LWP 包进行 HTTPS 传输,XML::Simple 用于解析 XML 有效负载。有时对XMLin 的调用会因 die() 而失败,然后我的脚本会死掉,并且必须由我编写的监控程序重新启动以检测这一点。这真的是不可取的,所以我想知道 Perl 是否有像 C++ 异常处理机制这样的工具,我可以在其中捕获 die 消息,忽略它报告错误并让我的脚本继续,就像发生错误一样?我已经阅读了许多 Perl 书籍并寻找了这个,但我没有设法找到一些东西。这正在扼杀我的应用程序,但我不想编写自己的 XML 解析代码,除非我必须这样做。

【问题讨论】:

  • 使用带有自己的错误处理程序的高级 SOAP 库,例如 SOAP::Lite

标签: perl lwp die xml-simple


【解决方案1】:

是的;这样做的基本机制是eval:

sub a { die "BAD"; }
eval { a(); }
print "Survived an exception $@";

但是,您应该使用更高级的构造(仍然在此之上构造)是有原因的,例如 Try::Tiny 等。 (请参阅其文档底部的链接)。

【讨论】:

  • 谢谢,我会试试看的。
【解决方案2】:

您可以捕捉“死”,但不能通过捕捉它来阻止脚本死去: *当“__DIE__”钩子例程返回时,异常处理将继续进行,就像没有钩子时一样,除非钩子例程本身通过“goto”、循环退出或“die()”退出。*

不过,您可以运行容易在 eval{} 块内调用 die() 的例程。

【讨论】:

  • 所以本质上,只要包遇到调用 die() 的条件,我的脚本就会终止?有什么我可以做的吗?哦,看来我最好开始 C++ 版本....
  • 嗯,是的,除了你已经被告知两次的那个 eval
猜你喜欢
  • 1970-01-01
  • 2019-09-09
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多