2017-10-05 63 views

回答

6

strict編譯包含禁止裸字的類別subsvars這需要你聲明的所有變量。那些是編譯時間錯誤。這些堆棧跟蹤沒有幫助,因爲它們直接源自該行的源代碼。

strict類別refs禁止字符串作爲參考,這是運行時錯誤。這裏一個堆棧跟蹤可能有助於找出字符串來自哪裏。

獲取堆棧跟蹤的一種方法是use Carp::Always(或作爲命令行標誌:-MCarp::Always)。這會修改所有錯誤和警告以包含堆棧跟蹤。因爲它使所有錯誤更長,所以最好只將它用作調試幫助。

如果您遇到子例程無效參數的問題,那麼驗證輸入可能會更好。例如爲:

use Carp; 

sub foo { 
    my ($ref) = @_; 

    # dies from the line where "foo()" was called 
    croak q(Argument "ref" must be a scalar reference) 
    unless ref $ref eq 'SCALAR' or ref $ref eq 'REF'; 

    do_something_with($$ref); 
} 

當使用從Carp(例如croak()confess())可以強制堆棧跟蹤的功能之一通過添加Perl的選項-MCarp=verbose

+3

'鯉魚:: cluck'和'鯉魚:: confess'總是輸出堆棧軌跡。 – mob

相關問題