我有一个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)
你绝对可以做你喜欢的事.
Check: {
last Check
if failcond1;
last Check
if failcond2;
success();
}
Run Code Online (Sandbox Code Playgroud)
你为什么不使用例外?任何不应遵循代码正常流程的情况都是例外.使用"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模块.但没有理由忽视例外; 以这种方式使用它们是完全可以接受的.