2014-02-18 5 views
6

Ich habe das gleiche Problem wie in Can't disable stack trace in Carp::croak() for some reason. Da jeder Aufruf im Stapel als "sicher" betrachtet wird, gibt croak() jedes Mal eine vollständige Stapelverfolgung aus. Ich möchte das für bestimmte Anrufe deaktivieren.Wie kann ich einen Anruf als "unsicher" mit Carp markieren?

Hier ist ein Beispiel:

use Carp; 

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

sub regular_code { 
    this_may_fail(); 
} 

regular_code(); 

Beide Subroutinen im selben Paket sind, so wird this_may_fail automatisch als sicher markiert. Gibt es eine Möglichkeit, Carp zu sagen, dass this_may_fail als unsicher betrachtet werden sollte?

+0

Ist 'regular_code()' das einzige, was Aufruf 'this_may_fail' ? Wenn ja, dann könntest du einfach einen normalen "Würfel" verwenden – Zaid

+0

'this_may_fail' wird von mehreren verschiedenen Orten aufgerufen, und ich muss wissen, woher es aufgerufen wurde, damit ich herausfinden kann, was schief gelaufen ist. – Jonathan

Antwort

3

Es ist regular_code das gilt als "sicher" von this_may_fail. Die Überprüfung basiert auf dem Namespace. Um es also unsicher zu machen, platzieren Sie this_may_fail in einem anderen Namespace.


Oder schreiben Sie Ihren eigenen Croaker.

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

Zu meiner Antwort hinzugefügt. – ikegami

+0

Ich habe schließlich einige meiner Funktionen in einen anderen Namensraum verschoben. Danke für deine Antwort. – Jonathan

3

Nicht especialy hübsch, aber statt dessen:

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

Sie diese verwenden könnte ...

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

Ihr Code ist verdreht. Ich mag dich. – Jonathan

Verwandte Themen