eval {
# here is put some code that may throw exception
return 1;
} or do {
my $error = $@;
# Handle error.
};
答案 0 :(得分:9)
有关使用eval
作为try
- 类型语句时可能出错的问题的讨论,请参阅Try::Tiny文档,如何避免这些问题以及发布的代码结束的原因使用1
(以确保eval
块在成功完成时返回true值。)
阅读之后,请考虑使用Try :: Tiny,而不是通过所有的旋转来确保每个eval
都能正常运作try
。毕竟,懒惰是程序员的first great virtue。
答案 1 :(得分:1)
你可以写上面的eval,
my $result = eval {
# here is put some code that may throw exception
1; # Why is the "1;" here ?
};
在这种情况下,$result
仅在 eval 内没有异常时才会1
,否则为undef。
因此,在这种特殊情况下,1
可确保在没有异常的情况下or do {..}
不会被执行。
if ($@) {..}
或许更习惯于做同样的事情,$@
在eval{..}
失败时始终设置为{{1}}。
答案 2 :(得分:1)
进行以下Perl eval子弹证明需要进行哪些更改?
如果我没记错的话,如果你关心$ @的内容(而不仅仅是它是否真实),你还需要防止$ @被其他代码覆盖掉,然后才会看到它(见回答1.以下)。
- 以下样式是否可以防止$ @未正确设置?
醇>
是的,$ {可以在eval
和if
之间的时间内被覆盖。如果我没记错的话,最常见的情况是使用成功的eval
超出范围的对象的DELETE方法(因为它在eval中)。
以下“1”是什么防范?
常量true值(不一定是1)用于确保eval
块返回true值。如果块中的代码死掉,那么该块将返回一个空字符串,并且do
块将运行。如果您确定块中的最后一个语句将始终为真,那么这是不必要的;但是,没有理由不确定恒定值。
“或者{”比“if($ @){”更好吗?如果是这样,为什么?
它避免了必须存储eval
块的返回值。你可以说
my $result = eval {
#do stuff
1;
};
unless ($result) {
# handle error
}