Leute geben mir Beispiele mit Karpfen, anstatt zu warnen. Warum? Was macht Karpfen besser als warnen?Warum sollte ich Carp statt in Perl verwenden?
Antwort
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.
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.
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.
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.