用鲤鱼里面报告正确的位置Try :: Tiny catch block

时间:2013-08-14 01:20:53

标签: perl try-catch perl-module error-reporting

我正在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行报告。有谁知道如何修复错误报告位置是我想要的?

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.