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.
- 1. Wann sollte ich AUTOLOAD von Perl verwenden?
- 2. Wann sollte ich String statt Stringstream verwenden?
- 3. Welche Perl-Datenbankschnittstelle sollte ich verwenden?
- 4. Welches Perl-Testmodul sollte ich verwenden?
- 5. Warum sollte ich glBindAttribLocation verwenden?
- 6. Warum sollte ich LabelFor in MVC verwenden?
- 7. Warum sollte ich Datetime in SQL verwenden?
- 8. Warum sollte ich nicht sizeof (double) in C-Dateien verwenden
- 9. Warum sollte ich io_service :: work verwenden?
- 10. Warum sollte ich Isolated scope verwenden?
- 11. Warum sollte ich Struts lernen und verwenden?
- 12. Warum sollte ich die Elementinitialisierungsliste verwenden?
- 13. Warum sollte ich Microsoft Expression Blend verwenden?
- 14. Wann/warum sollte ich Groovys @CompileStatic verwenden?
- 15. Warum sollte ich AutoDual nicht verwenden?
- 16. Warum sollte ich Java-Container verwenden?
- 17. Sollte ich FxCop verwenden und warum?
- 18. Warum sollte ich UNIVERSAL :: isa nicht verwenden?
- 19. Warum sollte ich divergierende Funktionen verwenden?
- 20. Bootstrap Customization: Warum sollte ich weniger verwenden?
- 21. Warum sollte ich atoi() nicht verwenden?
- 22. Warum sollte ich Ruby on Rails verwenden?
- 23. Wann/warum sollte ich eine Datenbank verwenden?
- 24. Warum sollte ich nicht Unity verwenden?
- 25. Sollte ich noch HTML-Entities verwenden? Warum?
- 26. Welches Google API-Suchmodul für Perl sollte ich verwenden?
- 27. Welche Version von Perl sollte ich unter Windows verwenden?
- 28. Sollte ich Shell-Argumente in Perl entkommen?
- 29. Warum drucke ich »statt»?
- 30. Warum ist der Exit Code 255 statt -1 in Perl?