perl - perl eval "...propagated"记录在哪里

标签 perl exception eval 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;

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

最佳答案

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

记录于 die

If LIST was empty or made an empty string, and $@ already contains an exception value (typically from a previous eval), then that value is reused after appending "\t...propagated". This is useful for propagating exceptions:

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

[...]

因此,不带任何参数的不相关 die 会在此设施中混淆。

关于perl - perl eval "...propagated"记录在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68412525/

相关文章:

perl - 如何在 Perl 模块中创建私有(private)函数?

perl - 如何使用 Perl 在 SFTP(版本 3)中将传输模式设置为 ASCII

java - 为什么我必须提供标识符?

javascript - 异常:在 ionic 2 应用程序中使用 facebook 登录后未捕获( promise )

ruby - 如何让 eval 返回带小数位的数字?

javascript - 使 eval 同步运行异步代码

perl - 对象而不是 Perl 中的全局变量

java io捕获异常

Bash - 如何避免命令 "eval set --"评估变量

regex - 在 Perl 中解析和规范化包含 2-3 百万行的文件