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)
我会说,这是相当合乎逻辑的行为,die不带参数使用。它应该做什么?
记录在模具中
如果 LIST 为空或成为空字符串,并且
$@已经包含异常值(通常来自前一个eval),则在附加 后重用该值"\t...propagated"。这对于传播异常很有用:Run Code Online (Sandbox Code Playgroud)eval { ... }; die unless $@ =~ /Expected exception/;[...]
因此die,在这个设施中,发出一个没有任何参数的无关紧要的东西会被混淆。
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |