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();

trycatch 是带有&amp;@ 原型的子程序。这意味着

try  ...  LIST
catch  ...  LIST

一样
&try(sub  ... , LIST)
&catch(sub  ... , LIST)

所以你的代码是一样的

&try(sub  ... , &catch(sub  ... , somefunction()));

如您所见,catch 块后缺少的分号导致 somefunctioncatch 之前被调用(它返回一个对象,告诉 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 的奇怪行为与否?的主要内容,如果未能解决你的问题,请参考以下文章

parseInt() 函数的奇怪行为

removeFromParent() 奇怪的行为

QLcdNumber 奇怪的行为

iOS奇怪的委托行为?

AdditionalSafeAreaInsets 的奇怪行为

UITableView 奇怪的行为