如何在 Perl 子例程中处理已捕获和未捕获的错误?
Posted
技术标签:
【中文标题】如何在 Perl 子例程中处理已捕获和未捕获的错误?【英文标题】:How do I handle both caught and uncaught errors in a Perl subroutine? 【发布时间】:2010-10-15 13:58:55 【问题描述】:这是"How can I get around a ‘die’ call in a Perl library I can’t modify?" 的后续。
我有一个子例程,它多次调用 Library-Which-Crashes-Sometimes。我没有用 eval 来处理这个子例程中的每个调用,而是让它死掉,并在调用我的子例程的级别上使用 eval:
my $status=evalfunction($param);;
unless($status)print $@; next;; # print error and go to
# next file if function() fails
但是,我可以并且确实可以在 function() 中捕获一些错误情况。在子例程和调用例程中设计错误捕获的最合适/优雅的方法是什么,以便我获得捕获和未捕获错误的正确行为?
【问题讨论】:
【参考方案1】:block eval 可以嵌套:
sub function
eval
die "error that can be handled\n";
1;
or do
#propagate the error if it isn't the one we expect
die $@ unless $@ eq "error that can be handled\n";
#handle the error
;
die "uncaught error";
eval function(); 1 or do
warn "caught error $@";
;
【讨论】:
你的括号看起来很漂亮! +1 好吧,我今天早上确实擦亮了它们。【参考方案2】:我不完全确定您想要做什么,但我认为您可以使用处理程序来完成。
$SIG__DIE__ = sub print $@ ;
eval function($param); 1 or next;
【讨论】:
以上是关于如何在 Perl 子例程中处理已捕获和未捕获的错误?的主要内容,如果未能解决你的问题,请参考以下文章