gpt4 book ai didi

perl - 引用重载 bool 的对象而死

转载 作者:行者123 更新时间:2023-12-01 00:48:41 24 4
gpt4 key购买 nike

我正在使用 Data::FormValidator处理 DBIx::Class 中的一些数据验证(通过 DBIx::Class::Validation )。如果验证失败,DBIC::Validation 最终会执行 croak $results,其中 $resultsData::FormValidator::Results目的。不幸的是,这种声音不会触发我在 DBIC 调用周围的 try/catch。

经过深入研究,我制作了这个简化的测试用例(完全不包括 DBIC):

use strict;
use Data::FormValidator;
use TryCatch; #or Try::Tiny or eval, same results for each

#setup a profile and values that fail under that profile
my $input_profile = {
required => [ qw( good_ip bad_ip ) ],
constraints => {
good_ip => 'ip_address',
bad_ip => 'ip_address',
}
};

my $validator = new Data::FormValidator({default => $input_profile});

my $input_hashref = {
'good_ip' => '127.0.0.1',
'bad_ip' => '300.23.1.1',
};
try {
my $results = $validator->check($input_hashref,'default');
die $results;
} catch (Data::FormValidator::Results $e) {
print STDERR "failed with ".scalar(@{$e->invalid('bad_ip')})." invalid\n";
}

我希望我的 catch block 会被触发。相反,没有任何反应(继续执行)。

查看 Results 对象的源代码,我发现它使用 success 方法重载了 bool。删除它可以解决我的问题,但我不明白为什么。如果这就是全部问题,是否有解决它的好方法?

最佳答案

长话短说

这是 TryCatch 中的错误。 $results 字符串化为空字符串,TryCatch 在它应该调用 if defined $@ 时调用 if $@


这是一个没有 Data::FormValidator 的例子:

use strict;
use warnings 'all';
use 5.010;

package Foo;

use overload '""' => sub { '' };

sub new {
bless {}, $_[0];
}

package main;

use TryCatch;

try {
my $foo = Foo->new;
die $foo;
}
catch($e) {
say "<<<$e>>>";
}

TryCatch 使用 Devel::Declare在 Perl 词法分析器遇到某些关键字时注入(inject)自定义代码。在这种情况下,它会生成如下内容:*

try;
{
local $@;
eval {
my $foo = Foo->new;
die $foo;
};
$TryCatch::Error = $@;
}

if ($TryCatch::Error) {

由于 $@ 是空字符串,if ($TryCatch::Error) 为 false 并且永远不会进入 catch block 。

这是一个错误(TryCatch 的 many 之一)。使用 eval 或 Try::Tiny(只记得检查 defined,而不是 truthy/falsey)。


* 如果您想准确查看注入(inject)的内容,请将环境变量 TRYCATCH_DEBUG 设置为 1。

关于perl - 引用重载 bool 的对象而死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39107596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com