如何在Perl中干净地处理错误检查?

Pau*_*han 1 perl

我有一个Perl例程来管理错误检查.基于先前的成功,大约有10种不同的检查,有些是嵌套的.这些通常不是特殊情况,我需要croak/ die.此外,一旦发生错误,执行其余检查就没有意义了.

但是,我似乎无法想出一个简洁的方法来解决这个问题,除非使用类似于以下可怕的黑客的东西:

sub lots_of_checks
{

 if(failcond)
 {
  goto failstate:
 }
 elsif(failcond2)
 {
  goto failstate;
 }

 #This continues on and on until...

 return 1; #O happy day!

 failstate:

 return 0; #Dead...
}
Run Code Online (Sandbox Code Playgroud)

我希望能做的事情是这样的:

do
{
 if(failcond)
 {
  last;
 }
 #...
};
Run Code Online (Sandbox Code Playgroud)

Sin*_*nür 12

空返回语句是false从Perl子返回而不是返回的更好方法0.后一个值在列表上下文中实际上是真的:

sub lots_of_checks {
    return if fail_condition_1;
    return if fail_condition_2;
    # ...
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

  • @Paul,空白返回在标量上下文中给出undef,空列表是列表上下文. (4认同)

Ins*_*lah 8

也许你想看看以下关于perl5中的异常处理的文章:


cha*_*aos 5

你绝对可以做你喜欢的事.

Check: {
    last Check
        if failcond1;
    last Check
        if failcond2;
    success();
}
Run Code Online (Sandbox Code Playgroud)


jro*_*way 5

你为什么不使用例外?任何不应遵循代码正常流程的情况都是例外.使用"return"或"goto"实际上是一回事,只是"不是你想要的".

(你真正想要的是延续,"返回","转到","最后"和"抛出"都是特殊情况.虽然Perl没有完整的延续,但我们确实有转义延续;请参阅http:// metacpan.org/pod/Continuation::Escape)

在您的代码示例中,您编写:

do
{
 if(failcond)
 {
  last;
 }
 #...
};
Run Code Online (Sandbox Code Playgroud)

这可能与以下内容相同:

eval {
   if(failcond){
       die 'failcond';
   }
}
Run Code Online (Sandbox Code Playgroud)

如果你想变得棘手并忽略其他异常:

my $magic = [];
eval {
    if(failcond){
        die $magic;
    }
}
if ($@ != $magic) {
    die; # rethrow
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用上面提到的Continuation :: Escape模块.但没有理由忽视例外; 以这种方式使用它们是完全可以接受的.