perleval“…传播”在哪里记录

在以下代码中,eval检查表达式是否有效。它捕获一个异常,并且我的代码打印出异常,而代码不会在此时死亡。到现在为止还挺好。

但是当die;随后遇到一个表达式时,异常文本会再次打印出来,没有我的要求,并添加了一条...propagated消息,给出了die;命令的行号。但在这一点上,例外文本是不合适和混乱的。似乎 perl 会保留eval错误消息或异常消息,直到我们到达die;.

下面发布的代码下方是两种解决方法,其中任何一种都会使行为消失。

这种特殊行为记录在哪里?背后的想法是什么?

#!/usr/bin/perl
use strict; use warnings;
my $str=q/(d/;
my $rgx;
eval{$rgx=qr/$str/};
if(length $@)
{
   print join('', 'qr/', $str, '/ does not compile: ',"n", $@, );
}
print "Got past eval. But next, at 'die;', it will print an error message that no longer pertains.n";
die;

解决方法 (1)。给出die;一个非空字符串:

#!/usr/bin/perl
use strict; use warnings;
my $str=q/(d/;
my $rgx;
eval{$rgx=qr/$str/};
if(length $@)
{
   print join('', 'qr/', $str, '/ does not compile: ',"n", $@, );
}
print "Got past eval. Next, the nonempty string in die ' '; flushes out the inappropriate exception message.n";
die ' ';

解决方法 (2)。执行另一个eval没有发现语法错误的:

#!/usr/bin/perl
use strict; use warnings;
my $str=q/(d/;
my $rgx;
eval{$rgx=qr/$str/};
if(length $@)
{
    print join('', 'qr/', $str, '/ does not compile: ',"n", $@, );
}
print "got past evaln";
$str=0;
eval{$rgx=qr/$str/};
die;

回答

我会说,这是相当合乎逻辑的行为,die不带参数使用。它应该做什么?

记录在模具中

如果 LIST 为空或成为空字符串,并且$@已经包含异常值(通常来自前一个eval),则在附加 后重用该值"t...propagated"。这对于传播异常很有用:

eval { ... };
die unless $@ =~ /Expected exception/;

[...]

因此die,在这个设施中,发出一个没有任何参数的无关紧要的东西会被混淆。


以上是perleval“…传播”在哪里记录的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>