Try::Tiny:try-catch 的奇怪行为与否?
Posted
技术标签:
【中文标题】Try::Tiny:try-catch 的奇怪行为与否?【英文标题】:Try::Tiny: Weird behaviour with try-catch or Not? 【发布时间】:2012-09-09 20:06:04 【问题描述】:我正在使用Try::Tiny
进行尝试捕获。
代码如下:
use Try::Tiny;
try
print "In try";
wrongsubroutine(); # undefined subroutine
catch
print "In catch";
somefunction();
...
sub somefunction
print "somefunction";
当我执行 它是这样的:
somefunction
In Try
In catch
输出序列对我来说看起来不对。这是错的吗?还是这是正常行为?
【问题讨论】:
try 部分被评估,所以当那里出现问题时,它会“死掉”,然后你会到达那个 catch 块,因为 $@ 是有效的。 【参考方案1】:就像忘记分号一样
print
somefunction();
导致输出somefunction
被传递给print
而不是$_
,缺少分号导致somefunction
的输出作为参数传递给catch
。
try
...
catch
...
; <--------- missing
somefunction();
try
和catch
是带有&@
原型的子程序。这意味着
try ... LIST
catch ... LIST
和
一样&try(sub ... , LIST)
&catch(sub ... , LIST)
所以你的代码是一样的
&try(sub ... , &catch(sub ... , somefunction()));
如您所见,catch
块后缺少的分号导致 somefunction
在 catch
之前被调用(它返回一个对象,告诉 try
在出现异常时该怎么做)和 @987654338 @。
代码应该是
&try(sub ... , &catch(sub ... )); somefunction();
这是通过在 try-catch 调用之后放置一个分号来实现的。
【讨论】:
谢谢。这真的很有帮助。我不知道在 catch 块之后需要;
。 +1。
这也是一个好奇心?为什么它没有抱怨或提出语法错误说缺少分号。
@Drt,您是否建议 print somefunction();
应该是语法错误,因为您可能指的是 print; somefunction();
?我详细解释了为什么它是完全合法的语法。
这就是 Perlcore!【参考方案2】:
你期望什么顺序?你的代码真的错过了catch
代码后面的分号吗?
【讨论】:
看起来你是对的 - 如果省略分号,somefunction()
将是 catch ...
的最后一个参数(不是单独的语句)。以上是关于Try::Tiny:try-catch 的奇怪行为与否?的主要内容,如果未能解决你的问题,请参考以下文章