3

carp在一个块中使用,它总是从错误的位置报告错误。for 的文档说它会将自己添加到其中,以便它不会出现在更长的回溯中。但它仍然出现在摘要行中。的文档说添加包名称将从堆栈跟踪和摘要行中删除包。所以我已经这样做了,但报告的位置仍然不正确。这是我正在使用的代码:Try::Tiny catchTry::Tiny%Carp::InternalCarp%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 行都报告错误。有谁知道如何将错误报告位置修复为我想要的?

4

1 回答 1

3

在我的实验中,此解决方案仅在调用者来自不同文件时才有效。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.
于 2013-08-14T01:20:53.203 回答