我在我的Perl程序中使用use strict
,但错误并没有那么有用,因为它们只列出了单个违规行。当使用严格失败时,有没有办法获得回溯?
答案 0 :(得分:6)
strict
编译指示包含禁止裸字的类别subs
,以及要求您声明所有变量的vars
。那些是编译时错误。这些的堆栈跟踪没有用,因为它们直接来自该行的源代码。
strict
类别refs
禁止字符串作为引用,这是运行时错误。这里的堆栈跟踪可能有助于找出该字符串的来源。
获取堆栈跟踪的一种方法是use Carp::Always
(或作为命令行标志:-MCarp::Always
)。这会修改所有错误和警告以包含堆栈跟踪。因为它会使所有错误更长,所以最好只将它用作调试帮助。
如果您遇到的问题是您的子程序获得了无效参数,那么验证输入可能会更好。 E.g:
use Carp;
sub foo {
my ($ref) = @_;
# dies from the line where "foo()" was called
croak q(Argument "ref" must be a scalar reference)
unless ref $ref eq 'SCALAR' or ref $ref eq 'REF';
do_something_with($$ref);
}
使用Carp
中的一个功能(例如croak()
或confess()
)时,您可以通过添加Perl选项-MCarp=verbose
来强制执行堆栈跟踪。