如何在Perl中终止程序——使用exit还是die?

32

我正在使用语法检查来判断我的Perl脚本是否以正确的方式使用。如果语法不正确,我会显示一条消息,说明正确的语法,并终止程序的执行。

以下是内容:

print "Please use the following syntax: ...";
exit 1;

而且:

die("Please use the following syntax: ...");

在没有异常处理的情况下,我应该使用哪个?我知道如果有异常处理,die将是答案,但这不是现实情况。

在没有异常处理的情况下,哪个是更好的程序终止选择?请说明原因。


7
值得注意的是,die函数会自动添加文件名和行号到错误信息末尾,除非错误字符串以换行符 "\n" 结尾。 - Grant McLean
3个回答

39

这取决于您希望针对 STDERR 和 STDOUT 进行哪些操作。我喜欢将错误和警告类型的消息发送到 STDERR,这样当有人试图将输出重定向到文件时,他们仍然能看到错误消息;但是,在某些情况下,STDOUT 用于向用户传达状态,以便他们可以使用 tail -f 或分页它,此时写入 STDERR 会给他们带来麻烦(他们必须使用 2>&1 将 STDERR 重新定向到 STDOUT,而并非每个人都知道如何做)。因此,使用 dieprintexit 取决于您正在编写哪种类型的程序。

使用 die 还有其他好处/缺点:

  • 您可以使用 eval 捕获 die,但不能捕获 exit
  • 您可以通过为 __DIE__ 信号安装信号处理程序来在程序调用 die 时运行代码
  • 您可以轻松地覆盖 die 函数

每个选项都有其方便和不方便的时候。


如果您使用warn警告错误消息,然后使用exit,您认为这是两全其美的选择吗? - Arc676
1
@Arc676 鉴于 warn 也写入 STDERR,我不明白为什么它在我描述的场景中比 printexit 更好。 重要的是要记住,没有所谓的“最佳”;只有在某些情况下可能有益或有害的行为。 通常,正确的答案是使用 die,因为这样可以在程序中获得最大的灵活性,但您必须考虑程序的用户将如何使用输出。 - Chas. Owens

23

print 会输出到 STDOUT,而 die 则输出到 STDERR

exit 1 以退出状态码 1 的方式退出,但是 die 会以当前的 errno 值即 $! 的方式退出。

因此,die 是首选方式,因为它更简单、更短小。


5
е¶ВжЮЬ $! дЄЇ 0пЉМеИЩзњїиѓСзїУжЮЬдЄЇ $? >> 8пЉЫе¶ВжЮЬ $? >> 8 дЄЇ 0пЉМеИЩзњїиѓСзїУжЮЬдЄЇ 255гАВиѓЈж≥®жДПдЄНи¶БжФєеПШеОЯжДПгАВ - Chas. Owens
2
$!是一个特殊的变量,用于暴露C errno值。$?是一个特殊的变量,用于保存由system、反引号等执行的最后一个程序的信息。有关更多信息,请参见http://perldoc.perl.org/perlvar.html#%24ERRNO和http://perldoc.perl.org/perlvar.html#%24CHILD_ERROR。 - Chas. Owens

7

点赞引用了最少惊奇规则! - Daniel Santos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接