perl eval“...传播”在哪里记录

Jac*_*lin 3 perl eval exception die

在以下代码中,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;
Run Code Online (Sandbox Code Playgroud)

解决方法 (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 ' ';
Run Code Online (Sandbox Code Playgroud)

解决方法 (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 eval\n";
$str=0;
eval{$rgx=qr/$str/};
die;

Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 6

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

记录在模具中

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

eval { ... };
die unless $@ =~ /Expected exception/;
Run Code Online (Sandbox Code Playgroud)

[...]

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