【问题标题】:How to terminate a program in Perl - exit or die?如何在 Perl 中终止程序 - 退出或死亡?
【发布时间】:2011-04-05 19:00:48
【问题描述】:

我正在使用语法检查来查看我的 Perl 脚本是否以正确的方式使用。如果语法不正确,我会显示一条消息,说明正确的语法是什么,然后结束程序的执行。

之间:

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

和:

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

我应该使用哪一个?我知道如果异常处理到位,die 会是答案,但事实并非如此。

对于没有异常处理的程序终止,哪一个是更好的选择?也请说出原因。

【问题讨论】:

  • 值得注意的是die会自动附加文件名和行号除非错误字符串以换行符结尾"\n"

标签: perl


【解决方案1】:

这取决于您希望使用 STDERR 和 STDOUT 发生什么。我更喜欢向 STDERR 发送错误和警告类型的消息,这样当有人试图将输出重定向到文件时,他们仍然会看到错误消息;但是,有时 STDOUT 用于向用户传达状态,以便他或她可以tail -f 或对其进行分页,并且在那些时候写入 STDERR 会导致他们痛苦(他们必须使用@987654322 将 STDERR 重定向回 STDOUT @,并不是每个人都知道该怎么做)。那么使用哪个dieprintexit,很大程度上取决于您编写的程序类型。

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

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

每个人都有很容易做到的时候,也有痛苦的时候可以做到。

【讨论】:

  • 如果你warn错误信息然后使用exit怎么办?你会考虑两全其美吗?
  • @Arc676 鉴于warn 也写入STDERR,我不认为在我描述的场景中这会比printexit 更好。重要的是要记住没有“最好”;只有在某些情况下可能有益/有害的行为。一般来说,正确的答案是die,因为它允许程序的最大灵活性,但您必须记住程序的用户将如何使用输出。
【解决方案2】:

print 打印到 STDOUTdie 打印到 STDERR

exit 11 的退出状态退出,但dieerrno 的退出当前值退出,即$!

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

【讨论】:

【解决方案3】:

最好遵循现有做法(“最小意外规则”):exit with 2 on a fatal error such as a syntax error

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 2021-03-04
    • 2015-05-10
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多