autodie有缺点吗?

sid*_*com 15 perl autodie

我一次又一次地看到StackOverflow上的人们推广使用autodie.但是在这里的代码和网络的其他地方,我并不经常看到autodie.有一些缺点吗?使用autodie时我会丢失什么吗?(我有使用autodie时被宠坏的想法)

raf*_*afl 18

autodie文档列出了您应该注意的一些问题和错误.但是,大多数都是相对较小的,从长远来看也是可以修复的.

除此之外没有真正的缺点,除了在旧的perl版本上运行时可能还有额外的依赖性.它不经常使用的事实很可能是因为它相对较新.然而,autodie(甚至旧的Fatal模块)通常是一个好主意.


bri*_*foy 8

这项技术大多数都很好,但它的作用是远距离而且神奇.有些人只阅读代码的某些部分可能无法理解会发生什么,因为autodie远离他们检查的代码.由于不是每个人都使用它而且它最近才成为一种做法,我怀疑大多数人并不期望它.这不是什么大不了的事,但对我来说这种事总是很难看.

  • 许多人不会知道autodie是启用的,因为它的声明远离他们正在查看的代码. (4认同)

Dav*_* W. 5

有一种语言模型遵循C的基于函数的范例,其中所有函数都返回一个值,并由用户检查返回值.Perl就在这个组中.如果我调用一个函数,我有责任检查该函数是否实际返回了一些有用的函数.

还有另一种语言模型遵循Java基于异常的范例,其中失败的函数返回异常,如果用户需要处理异常,则它们必须显式处理异常.自Java以来​​编写的大多数现代语言遵循这种基于异常的方法.

较新的语言是基于异常的,因为它处理惰性开发人员问题.在C风格的编程语言中,如果开发人员忘记或者不愿意检查函数的退出状态,程序将继续.在Java风格的编程语言中,程序终止.在这两种情况下,开发人员都可以处理无效函数结果的问题,而基于异常的语言迫使开发人员这样做.

你为什么不看到use autodie这里?几个理论:

这是新的

autodiepragma是相当新的,大多数开发人员没有很好的方法将新知识纳入他们的Perl编程.例如,say自5.10以来一直存在,但我仍然看到很少有开发人员使用它,即使它是一个很大的改进print,并且使用简单.如果开发人员autodie在最初学习Perl时没有学习,他们可能永远不会知道它.

Perl中没有Try/Catch语法

以下是Perl的工作原理:

open $fh, "<", $file;
if ( not defined $fh ) {
   ...    # What I do if `$fh` didn't get set.
}
Run Code Online (Sandbox Code Playgroud)

我检查了$fh我的open陈述之后的值(好吧,通常你检查open自己的返回值而不是打开的$fh,但请耐心等待我!).语法相当简单和干净.这很容易理解.

如果您使用autodie并采用基于异常的方法怎么办?try/catch在Perl中没有像Java那样的内置语句.相反,你采用半笨拙的方式使用eval:

use autodie;
my $fh;     # Got to be declared outside of the eval
eval {
    open $fh, "<", $file;
};        # Don't forget that semicolon!
if ( $@ ) {
   ...    # What I do if function "foo" doesn't return a good value...
}
Run Code Online (Sandbox Code Playgroud)

你能说呀?我知道你可以!因为$fh是词法范围,我必须在我之前声明它eval.另外,我甚至没有涉及成为$@全球范围变量的整个问题!

这是不完整的方式

大多数模块和内置的功能不工作,autodie这是或多或少受限于IO要求,fork,system,和exec,即使在这里,它是不完整的:printflock不工作autodie.除此之外,没有其他Perl内置功能可以使用autodie.从空数组中弹出值不会强制我的程序呱呱叫.很少有模块检查状态,autodie以查看它们的功能或方法是否应该croak返回错误值.因此,将Perl转换为基于异常的语言的整个想法都不会发生.

即使你认为autodie可行的地方也不行.如果您使用File::Copy获取copymove命令,请不要依赖于autodie捕获错误的文件副本.你仍然需要检查返回值copy.如果您使用File::IO,所有投注autodie均已关闭.

因此,autodie它并没有完全兑现将Perl转变为更基于异常的编程语言的大胆承诺.对于大多数人来说,它主要是捕获open语句,大多数开发人员都没有问题open ... or die....

我喜欢基于异常的开发方法,我相信默认情况下所有模块都应该出错.强制开发人员处理异常而不是忽略它们.当出现问题时,我会将模块和函数编写为croak,并用于eval处理异常.不幸的是,autodie现在并没有做很多事情.