在 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 中的文件?