如何在 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 子例程中处理已捕获和未捕获的错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Perl子例程中使用$ a和$ b

仅在子例程中需要时才使用 Perl 模块

如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数

将两个或多个数组传递给 Perl 子例程

在子例程中保留 VBA 函数值

在子例程中退出 Select Case