2011-12-22 28 views
1

給出下面的代碼示例,當運行Main :: main時,如果eval塊失敗,我會假設角色中的'after'塊永遠不會運行。但是,我正在調試一個間歇性的,難以糾正的錯誤,這表明事實並非如此。Moose角色修飾符函數的失敗行爲

有人可以解釋'扁平化'過程如何在這種情況下工作,並且如果有任何條件,eval會失敗,但後面的塊會運行?

感謝 喬希

package MyRole; 
use Moose::Role; 

after 'main' => sub { 
    #some code that depends on main executing 
}; 

package Main; 
use Moose; 
with 'MyRole'; 

sub main { 
    eval { 
     #main work 
    }; 
    if ([email protected]) { 
     die 'what happens now?'; 
    } 
} 

回答

2

如果main模具,然後將修改後不會運行。但是,eval可能會失敗,但[email protected]可能是錯誤的。聽起來這一定是這裏發生的事情。如果eval失敗,但[email protected]爲false,則您的錯誤處理代碼將不會運行並且main不會引發異常。因此,在main之後的代碼將被運行。

這是Try::Tiny保護您免受侵害的其中一件事。

2
  • MyRole :: main()通常會在Main :: main()之後執行。

  • 它們並沒有完全平鋪成一個接一個的方法,因爲你在Main :: main()中返回的東西仍然是返回的,並且你在MyRole :: main()中返回的任何東西都被忽略。如果'主要工作'失敗,MyRole :: main()將不會執行,因爲你也死於catch(if [email protected])塊,這意味着執行流程會在到達MyRole :: main()之前死亡。 。