【发布时间】:2017-07-28 19:42:09
【问题描述】:
当数据被错误地传递给子例程时,Perl 中的最佳实践是什么?潜艇应该死掉还是返回?
这是我通常做的事情
my @text = ('line 1', 'line 2');
print_text(\@text)
or die "ERROR: something went wrong in the sub";
sub print_text{
my ($aref_text) = @_;
return unless ref($aref_text) eq "ARRAY";
print "$_\n" for @{$aref_text};
return 1;
}
如果传递的输入无效并且它希望调用者像这里一样检查错误,那么这里 sub 只会返回。我想知道在子级别“死”是否总是更好的做法。在大脚本中,我害怕这样做,因为我不想仅仅因为一些简单的子失败而杀死整个脚本。
另一方面,我害怕只是返回,因为如果调用者忘记检查 sub 是否返回 true,那么脚本将继续运行,并且可能会发生奇怪的事情。
谢谢
【问题讨论】:
-
@hanshenrik:我看不出这有什么帮助。
-
这应该是调试的一部分,我认为编写这样的特定检查代码会给人一种错误的安全感。确保给定的参数确实是一个数组引用,例如,一个数组引用只涵盖了一小部分可能的错误,如果您尝试将其他东西作为数组取消引用,Perl 将引发它自己的异常。到目前为止,最常见的错误在很大程度上是无法检测到的,例如您的引用可能引用了一个包含旧数据的数组。
-
很少有代码在不使整个运行无效的情况下失败,因此最好向
die提供有用的信息,而不是让您的程序继续运行并提供不正确的结果。但是,再多的类型检查也无法提供与最小测试程序相同的保护。这就是为什么 Java 和 C++ 的复杂而冗长的语法是基于一种误解。 Perl 在很多方面都臭名昭著,但容易出错的代码并不是其中之一,即使它只有非常基本的类型检查。 -
请注意,如果返回
0,则返回or的简单决定将变为die。我认为你的意思只是作为一个例子,但是如果0(或空字符串)是一个有效的回报呢?然后你会以defined为条件,所以我想是func() // die ...。但是,如果返回undef是解决无效结果的好方法怎么办?等等。这是一个更大的设计决策的一部分,原则上应该考虑到你的所有代码。没有“最佳实践”。 -
真正重要的是有单元测试来测试你在坏变量上的边缘情况,这样你就可以确信如果用户确实发送了不正确的数据,你就会确切地知道程序在这些情况下会做什么。
标签: perl