有一两件事你可以做,使这稍微好一点的是简单地在错误/未定义的结果return;
。有些情况下return undef;
可以评估为true
。你可以看看Perl Best Practices关于错误处理的章节,因为它涵盖了这一点,并且有其他好的指针。
例如,如果:
my $ret=some_subroutine();
print "ERROR: $_" unless(defined $ret);
成为
my @ret=some_subroutine(); # oops!
print "ERROR: $_" unless(defined $ret);
你有一个奇怪的问题(不是捕捉错误),可能很难追查,而如果你return;
从some_subroutine
你得到:
my @ret=some_subroutine(); # oops!
print "ERROR: $_" unless($ret); # but error is still caught
此外,在函数t帽子应该返回一个列表:
my @ret=some_other_subroutine(); # OK
print "ERROR: $_" unless($ret); # error will be caught if you "return;"
# ... but later ...
my $ret=some_other_subroutine(); # oops!
print "ERROR: $_" unless($ret); # if you "return;" $ret will equal 0
# (the length of the returned list)
# and the error will be caught
所以,虽然也有其他模式用于从函数返回的错误/妾身,总是使用return;
允许使用一个模式的几乎所有功能,无论是在返回适当的值以及何时需要检查错误状态。
当错误不是“例外吗?”时,您是否觉得它在语义上有价值返回错误/未定义状态?如果你期待的是,一个文件可能不在那里,那么在语义上是不是更有意义的返回错误状态而不是抛出异常?这是一个小问题,我知道...... – wprl 2011-04-18 21:59:23
@SoloBold不要因为“异常”的确切含义而太受伤。如果子程序不能完成它的工作,这是一个特例。如果这意味着调用者无法期望正常的返回值,那么这是一个特例。如果你编写一个检查文件存在的子程序,那么它不在那里是不例外的。如果你编写一个读取和解析文件的例程,它应该会在文件不存在时抛出异常。 – Schwern 2011-04-19 11:37:00
...如果较大的系统没有找到那个文件,你可以在这个文件中加上一个包装来检查文件是否存在,如果没有则返回空的结构。最后,程序员会忘记编写错误处理代码,但你必须故意忽略一个异常。它针对懒惰进行了优化。 – Schwern 2011-04-19 11:39:09