2008-10-09 8 views

Antwort

42

Karpfen gibt Ihnen weitere Informationen darüber, wo die Nachricht stammt aus (Kontext)

#!/usr/bin/perl 

use Carp; 

foo(); 
bar(); 
baz(); 

sub foo { 
    warn "foo"; 
} 

sub bar { 
    carp "bar"; 
} 

sub baz { 
    foo(); 
    bar(); 
} 

produziert

foo at ./foo.pl line 9. 
bar at ./foo.pl line 13 
     main::bar() called at ./foo.pl line 6 
foo at ./foo.pl line 10. 
bar at ./foo.pl line 14 
     main::bar() called at ./foo.pl line 19 
     main::baz() called at ./foo.pl line 7 

irgendwie für dieses kleine Programm albern, aber ist praktisch, wenn Sie wollen Wissen Sie, wer die Methode genannt hat, die karpiert.

12

Karpfen funktioniert besser zum Debuggen innerhalb von Modulen. Wenn Sie nur ein einfaches Skript schreiben, gibt es keinen Vorteil. Von the Carp documenation:

Die Karpfen-Routinen sind nützlich in Ihrer eigenen Module, weil sie wie Würfel wirken() oder warnen(), aber mit einer Nachricht, die eher als nützlich für einen Benutzer des Moduls ist. Im Fall von Gluck, Geständnis und Langeweile ist dieser Kontext eine Zusammenfassung von jedem Anruf in dem Anruf-Stapel. Für eine kürzere Nachricht können Sie Karpfen oder Krächzen verwenden, die den Fehler als den Ort melden, an dem Ihr Modul aufgerufen wurde. Es gibt keine Garantie, dass dies der Fehler war, aber es ist eine gute Vermutung.

22

Ich benutze für Skripte und einfache Programme und Carp innerhalb beliebiger Module. Die Unterroutinen Carp verwenden den Dateinamen und die Zeilennummer, an der Ihre aktuelle Subroutine aufgerufen wurde, so dass es einfacher ist, den Fehler zu finden (nicht nur, wo das Problem sich manifestiert hat).

Damian empfiehlt Carp statt warn in "Reporting-Failure" in Perl Best Practices, aber nicht den Unterschied zwischen Skripten als Top-Level-Code-Konstrukte und Module als Komponenten machen die Programme verwenden.

Ich habe mich in letzter Zeit meistens nicht darum gekümmert, weil ich Log::Log4perl verwendet habe, um all das zu behandeln.

8

Carp meldet Fehler aus der Sicht des Aufrufers. Dies ist nützlich für Module, bei denen Sie normalerweise vor einer inkorrekten Verwendung warnen möchten (z. B. ein fehlendes Argument) und die Stelle angeben, an der der Fehler aufgetreten ist, im Gegensatz zu . Dies ist besonders wichtig für Utility-Funktionen, die an vielen Orten verwendet werden können.

Die meisten Autoren verwenden in Skripten und in Modulen. Gelegentlich verwende ich innerhalb eines Moduls, wenn ich möchte, dass die Fehlermeldung ein Problem in der Implementierung des Moduls widerspiegelt (zB ein Fall, den es unterstützen sollte, aber nicht.) Es ist wohl besser, dass cluck in solchen Situationen besser ist Stapel zurückverfolgen.

Verwandte Themen