在 perl 中出现错误但没有堆栈跟踪的正确方法是啥?

Posted

技术标签:

【中文标题】在 perl 中出现错误但没有堆栈跟踪的正确方法是啥?【英文标题】:What is the correct way to die with an error but without a stack trace in perl?在 perl 中出现错误但没有堆栈跟踪的正确方法是什么? 【发布时间】:2011-04-05 08:28:14 【问题描述】:

我正在编写一个 perl 脚本,在我检查用户在命令行上提供的选项的部分,我想退出并显示一个错误,解释选项的问题。在这种情况下,不需要堆栈跟踪与此错误消息一起出现。那么,什么是最好的死掉错误消息但没有堆栈跟踪或调试信息的方法呢?

我尝试了以下方法:

die "Invalid options";

产生

Invalid options at myscript.pl line 49.

然后,我尝试了

use Carp;
...
croak "Invalid options";

产生

Invalid options at myscript.pl line 47
    main::prepare_output_directory() called at myscript.pl line 546

那么我怎么能只用Invalid options 而没有别的呢?

额外问题:为什么croak 告诉我错误在第 47 行,而对 croak 的实际调用在第 49 行?

【问题讨论】:

re: 额外问题,为你的发牢骚显示更多上下文? 不要介意奖金问题。我只是想知道是否有一些普遍的原因。 对于您的额外问题:croak 尝试从呼叫者的角度报告行号。阅读Carp 模块的文档。 【参考方案1】:

只需在die 字符串的末尾添加一个换行符:

die "Invalid options\n";

这将防止错误的位置被附加到您的消息中。

【讨论】:

我猜他们阅读了文档。 perldoc -f die 我希望有一种方法可以对croak 做同样的事情。我的理解是,从语义上讲,die 用于内部错误,而croak 用于由外部原因引起的错误。在这种情况下,我想指出用户输入了无效的选项,这显然是后者的情况。然而我必须死而不是呱呱地压制回溯。

以上是关于在 perl 中出现错误但没有堆栈跟踪的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何将堆栈跟踪(Carp 输出)转储到 Perl 中的文件?

如何在 Cloudera 中查看完整的异常/错误堆栈跟踪

符号化没有崩溃日志的 iOS 崩溃堆栈跟踪

提供了无效的请求URI。 (堆栈跟踪中没有有用的信息)

如何通过正确的 Crashlytics 错误分组获得更好的 RxJava 堆栈跟踪

在 Firefox 开发人员工具中查看 JavaScript 堆栈跟踪错误(如在 Chrome 中)