perl - Carp::croaked时如何获得正确的行号?
问题描述
有没有正确的方法来获取croak
被调用的行号?
在以下示例中,我进入$stack
:
- 第 22 行,最后一个子程序 (
l
) 被调用的地方 - 第 44 行,其中
try
-block 终止 - 堆栈中的所有其他调用
但我想知道第 28 行,我称之为croak
(或confess
);
#!/usr/bin/env perl
{
package Module;
use strict; use warnings;
use Carp qw(croak confess longmess);
our @CARP_NOT = qw(Try::Tiny);
use Try::Tiny;
sub i {
my ($x) = @_;
j($x);
}
sub j {
my ($x) = @_;
k($x);
}
sub k {
my ($x) = @_;
l($x);
}
sub l {
my ($x) = @_;
my $stack = longmess();
croak( { data => 1, stack => $stack } ) if $x =~ /\D/; # or confess
return $x;
}
1;
}
use strict; use warnings; use 5.014;
import Module;
use Try::Tiny;
use Data::Dumper;
try {
Module::i("x");
} catch {
say Dumper $_;
};
解决方案
sub _lm { longmess() }
sub l {
my ($x) = @_;
die( { data => 1, stack => _lm() } ) if $x =~ /\D/;
return $x;
}
或者
sub l {
my ($x) = @_;
local $Carp::CarpLevel = $Carp::CarpLevel - 1;
die( { data => 1, stack => longmess() } ) if $x =~ /\D/;
return $x;
}
或者
sub mycroak { die( { @_, stack => longmess() } ); }
sub l {
my ($x) = @_;
mycroak( data => 1 ) if $x =~ /\D/;
return $x;
}
(替换croak
为die
因为您没有利用croak
' 的任何功能。)
推荐阅读
- java - 用 Kotlin 创建的房间数据库,用 Java 编写的活动,我可以这样做吗?
- javascript - 如何使用javascript获取每个项目的剩余数量
- json - 如何创建向 AWS API Gateway 发出 PUT/POST 请求以更新 DynamoDB 中的项目的链接?
- google-cloud-platform - 集群摄取时间分区表
- python - 来自 url 的 python pandas.read_csv
- amazon-web-services - 为什么 ec2:Get* 不在 AmazonEC2ReadOnlyAccess 中
- python - 如何处理写入数据库并在 API 服务器中异步响应?
- dart - 使用列表访问飞镖颤振中的功能
- docker - Docker 应用程序无法在 docker-compose 中使用闪亮代理启动,与运行一起使用
- marklogic - 从根节点提取元素并填充每个文档