eval {
# here is put some code that may throw exception
return 1;
} or do {
my $error = $@;
# Handle error.
};
- 以下样式是否可以防止 $@ 设置不正确?
- 下面的“1;”是什么意思?防范?
- “or do{”比“if ($@){”更好吗?如果是这样,为什么?
eval {
# here is put some code that may throw exception
return 1;
} or do {
my $error = $@;
# Handle error.
};
你可以在 eval 上面写,
my $result = eval {
# here is put some code that may throw exception
1; # Why is the "1;" here ?
};
在这种情况下,只有在 eval 内没有异常时才会出现$result
,否则为 undef。1
因此,在这种特殊情况下1
,确保or do {..}
在没有异常的情况下不会执行。
if ($@) {..}
可能是做同样事情的更惯用的方式,并且 $@
总是在eval{..}
失败时设置。
进行以下 Perl eval 防弹证明需要哪些更改(如果有)?
如果我没记错的话,如果您关心 $@ 的内容(而不仅仅是它是否正确),您还需要防止 $@ 在您查看它之前被其他死掉的代码覆盖(请参阅对 1 的回答。 以下)。
- 以下样式是否可以防止 $@ 设置不正确?
是的,$@ 可以在eval
和之间的时间内被覆盖if
。如果我没记错的话,最常见的情况是使用成功的eval
.
下面的“1;”是什么意思?防范?
恒定的真值(不必为 1)用于确保eval
块返回真值。如果块中的代码死了,那么该块将返回一个空字符串并且该do
块将运行。如果您确定块中的最后一条语句始终为真,则没有必要;但是,没有理由不只是确定常数值。
“or do{”比“if ($@){”更好吗?如果是这样,为什么?
它避免了必须存储eval
块的返回值。你可以说
my $result = eval {
#do stuff
1;
};
unless ($result) {
# handle error
}