我正在Try::Tiny
carp
块中使用catch
,并且它始终从错误的位置报告错误。 Try::Tiny
的文档说它会将自己添加到%Carp::Internal
,以便它不会出现在较长的回溯中。但它仍然出现在摘要行中。 Carp
的文档说,将包名称添加到%Carp::CarpInternal
将从堆栈跟踪和摘要行中删除包。所以我已经这样做了,但报告的位置仍然不正确。这是我正在使用的代码:
MyPackage::foo();
package MyPackage;
use Try::Tiny;
use Carp;
use vars qw(%Carp::CarpInternal);
$Carp::CarpInternal{'Try::Tiny'}++;
use Data::Dumper;
print Dumper \%Carp::CarpInternal;
print Dumper \%Carp::Internal;
sub foo {
carp 'bar1';
try{
carp 'bar2'
}catch {
carp $_;
}
}
1;
这就是打印的内容:
bar1 at myFile.t line 1.
bar2 at myFile.t line 21.
$VAR1 = {
'Try::Tiny' => 1,
'warnings' => 1,
'Carp' => 1
};
$VAR1 = {
'Try::Tiny' => 1,
'Exporter::Heavy' => 1,
'Exporter' => 1
};
这两个变量是我所期望的,但我希望错误都在myFile.t的第1行报告。有谁知道如何修复错误报告位置是我想要的?
答案 0 :(得分:2)
在我的实验中,此解决方案仅在调用者来自不同文件时才有效。在这种情况下,将Try::Tiny
添加到@CARP_NOT
变量以修复程序包:
#first file
use MyPackage;
MyPackage::foo();
#second file
package MyPackage;
use Carp qw(carp cluck);
our @CARP_NOT = qw(Try::Tiny);
use Try::Tiny;
sub foo {
carp 'bar1';
cluck 'bar2';
try{
carp 'bar3'
}catch {
cluck $_;
}
}
1;
它打印以下内容:
bar1 at myFile.t line 2.
bar2 at MyPackage.pm line 8.
MyPackage::foo() called at myFile.t line 2
bar3 at myFile.t line 2.