尝试:: Tiny:使用try-catch或Not的奇怪行为?

3 perl cpan exception-handling try-catch weak-typing

我正在使用Try::Tinytry-catch.

代码如下:

use Try::Tiny;

try {
    print "In try";
    wrongsubroutine();  # undefined subroutine
}
catch {
    print "In catch";
}

somefunction();
Run Code Online (Sandbox Code Playgroud)

...

sub somefunction {
    print "somefunction";
}
Run Code Online (Sandbox Code Playgroud)

当我执行时它是这样的:

somefunction
In Try
In catch
Run Code Online (Sandbox Code Playgroud)

输出序列对我来说是错误的.这是错的吗?或这是正常的行为吗?

ike*_*ami 18

就像忘记分叉一样

print
somefunction();
Run Code Online (Sandbox Code Playgroud)

导致输出somefunction传递给print而不是$_,缺少的分号导致输出somefunction作为参数传递给catch.

try {
   ...
}
catch {
   ...
};      <--------- missing
somefunction();
Run Code Online (Sandbox Code Playgroud)

try并且catch&@原型的子程序.这意味着

try { ... } LIST
catch { ... } LIST
Run Code Online (Sandbox Code Playgroud)

是相同的

&try(sub { ... }, LIST)
&catch(sub { ... }, LIST)
Run Code Online (Sandbox Code Playgroud)

所以你的代码是一样的

&try(sub { ... }, &catch(sub { ... }, somefunction()));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在catch块之后丢失的分号导致somefunction之前被调用catch(返回一个对象,该对象告诉try如何对异常执行操作)和try.

代码应该是

&try(sub { ... }, &catch(sub { ... })); somefunction();
Run Code Online (Sandbox Code Playgroud)

这是通过在try-catch调用后放置一个分号来实现的.