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

问题描述

在以下代码中,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('',);
}
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('',);
}
print "got past eval\n";
$str=0;
eval{$rgx=qr/$str/};
die;

解决方法

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

记录在 die

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

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

[...]

因此,在此工具中,发出不带任何参数的不相关 die 会被混淆。

,

您需要向 down 提供错误消息。如果不这样做,这就是可能的 documented 结果之一。

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

"\t...propagated"

如果您想退出而不打印任何内容,您需要 exit

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

但是,以下是更好、更惯用的解决方案:

exit( $! || ( $? >> 8 ) || 255 );   # The value that `die` uses.