perl中的全局级异常处理

时间:2016-02-29 07:09:24

标签: perl perl-module

我编写了一个perl程序,内部调用了三个perl模块。在查看代码后,我的主管要求我添加全局异常处理。我不明白他的意思。他还说使用Eval来完成这个。我不知道如何使用Eval以便它在enire perl模块中捕获任何异常。任何人都可以通过提供链接或提供解释来帮助我吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

  

对于每个程序,他希望我有一个异常处理,如果出现问题,它将突出显示,我们可以轻松调试。

当发生未捕获的异常时,它将打印到STDERR。您的突出显示要求已经满足。

异常消息已经包含引发它们的行号(除非特别禁止),因此一些有助于调试的信息已经可用。

NETWORK_SERVICE

在脚本中添加$ perl -e'sub f { die "bar" } f("foo")' bar at -e line 1. 也会导致提供堆栈回溯,从而提供更多信息。

use Carp::Always;

答案 1 :(得分:0)

你得到的问题似乎不精确。 "全球"和eval有些矛盾,如 Borodin在他的评论中解释道。另一种做事的方式"全球"在ikegami的回答中给出了。但是,由于这里提到eval 是特定的,因此对它的基本用法进行了简要介绍。

您在代码块上使用eval(或表达式,但这不是您想要的)。如果die被抛出到该块内的任何位置,eval捕获到了你获得控制权的意义上的程序,那么程序就不会死。变量$@将填充错误消息。然后,您可以查询发生的情况,打印出诊断信息,并可能从错误中恢复。

eval {  run_some_code(@args) };
if ($@) {
    carp "Error in `run_some_code()`: $@ --";
    # Do further investigation, print, recover ...
}

您可以在上面eval块中包含任何代码,但它不需要是单个函数调用。请注意,eval本身会返回传达所发生事件的值(除了设置$@之外)。

至于"全球"在您的问题陈述中,我想到的一件事是您在eval级别使用main:: - 将自己从模块中调用函数的任何子函数包装在其中。

关于例外的一个关键问题是它们会冒泡"。当一个die(Perl唯一的例外)被抛入一个sub并且调用者没有eval它时,它会上升到调用链...最终出现在{ {1}},如果它没有被捕获(main:: - ed)那么然后程序就会死掉。因此,eval可以eval进行顶级电话会议,并了解下方是否出现任何问题。

main::

如果在eval { top_level_call(); }; if ($@) { warn "Error from somewhere in `top_level_call(): $@"; } # Functions sub top_level_call { # doing some work ... another_sub(); # doing more ... } sub another_sub { # do work, no eval checks } 中发生错误触发die,则其处理立即停止并且控件将返回给调用方another_sub()。由于该子不检查(其中没有top_level_call()),它的执行也在该点停止,并且控制返回其调用者(在本例中为eval本身)。所以它最终会点击main::main:: - 让你知道错误,你的程序不会退出。

或许这就是"全球"使用eval进行异常处理。

如果这是您需要做的事情,您可以沿着这些方向做更多的事情。有关初学者,请参阅eval。 通过澄清更新您的问题,以便您在此处获得更多讨论。

实际上,我会说你让自己了解eval使用以及一些"全球"错误报告,然后按照Borodin的建议,向您的主管询问澄清和/或示例。