2014-02-18 30 views
6

我有和Can't disable stack trace in Carp::croak() for some reason一樣的問題。因爲堆棧中的每個調用都被認爲是「安全」,所以每次打印完整的堆棧跟蹤。我想禁用某些電話。如何將通話標記爲與Carp「不安全」?

下面是一個例子:

use Carp; 

sub this_may_fail { 
    # Some code... 
    croak "This call failed!"; 
} 

sub regular_code { 
    this_may_fail(); 
} 

regular_code(); 

兩個子程序是在同一個包,所以this_may_fail被自動標記爲安全。有沒有辦法告訴鯉魚this_may_fail應該被認爲是不安全的?

+0

是'regular_code()'唯一調用'this_may_fail' ?如果是這樣的話,那麼你可以使用一個普通的'die' – Zaid

+0

'this_may_fail'從幾個不同的位置被調用,並且我需要知道它被調用的位置,這樣我就可以找出錯誤。 – Jonathan

回答

3

這是regular_code這被認爲是「安全」由this_may_fail。該檢查基於命名空間,因此爲了使其不安全,您應該將this_may_fail置於不同的命名空間中。


或寫你自己的黃花魚。

perl -e' 
    use Carp qw(); 
    sub untrusting_croak { 
     goto &Carp::croak if $Carp::Verbose; 
     my @caller = caller(1); 
     die(join("", @_)." at $caller[1] line $caller[2]\n"); 
    } 

    sub f { untrusting_croak("!!!"); } # Line 9 

    f();         # Line 11 
' 
!!! at -e line 11 
+0

加入我的回答。 – ikegami

+0

我最終將一些函數移動到了不同的命名空間。感謝您的回答。 – Jonathan

3

並非特別是具有漂亮的,但是,不是這樣的:

sub regular_code { 
    ...; 
    my $result = this_may_fail(@args); 
} 

您可以使用此...

sub regular_code { 
    ...; 
    my $result = do { 
     my $sub = \&this_may_fail; 
     package DUMMY; $sub->(@args) 
    }; 
} 
+0

您的代碼被扭曲。我喜歡你。 – Jonathan

相關問題