我编写了一个perl程序,内部调用了三个perl模块。在查看代码后,我的主管要求我添加全局异常处理。我不明白他的意思。他还说使用Eval来完成这个。我不知道如何使用Eval以便它在enire perl模块中捕获任何异常。任何人都可以通过提供链接或提供解释来帮助我吗? 提前谢谢。
答案 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的建议,向您的主管询问澄清和/或示例。