Wie kann ich einen "Die" -Aufruf in einer Perl-Bibliothek umgehen, die ich nicht ändern kann?
Ja, das problem ist mit einer Bibliothek, die ich verwende, und Nein, ich kann es nicht ändern können. Brauche ich einen workaround.
Im Grunde bin ich den Umgang mit einem schlecht geschriebenen Perl-Bibliothek, die Ausfahrten mit 'sterben', wenn ein bestimmter Fehler aufgetreten ist beim Lesen einer Datei. Rufe ich diese routine vom Programm die Schleife über Tausende von Dateien, eine Handvoll, die sind schlecht. Schlechte Dateien passiert, ich will einfach nur meine routine, um einen Fehler zu protokollieren und bewegen auf.
WENN ich ändern KÖNNTE, die Bibliothek, ich würde ändern Sie einfach die
die "error";
einer
print "error";return;
aber ich kann nicht. Gibt es eine Möglichkeit, ich kann die couch der routine, so dass die schlechten Dateien, die nicht zum Absturz des gesamten Prozesses?
NACHFOLGE-FRAGE: Mit einer "eval" - couch-der Absturz-anfällig Aufruf funktioniert gut, aber wie richte ich die Handhabung für fangen-können Fehler in diesen Rahmen? Zu beschreiben:
Ich habe ein Unterprogramm, das ruft die Bibliothek-die-Abstürze-manchmal mehrmals. Eher als couch-jeder Anruf innerhalb dieser Unterroutine mit einem eval{}, ich Erlaube einfach, dass Sie zu sterben, und verwenden Sie eine eval{} auf die Ebene, ruft mein Unterprogramm:
my $status=eval{function($param);};
unless($status){print $@; next;}; # print error and go to next file if function() fails
Aber es gibt Fehlerzustände, die ich können und tun, catch-in-Funktion(). Was ist die richtige/eleganter Weg, um design den Fehler-Fang in das Unterprogramm und dem aufrufenden routine, so daß ich das richtige Verhalten für beide erwischt und nicht erfasste Fehler?
InformationsquelleAutor der Frage Ed Hyer | 2009-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie wickeln Sie es in ein
eval
. Siehe:Zum Beispiel könnten Sie schreiben:
Dies wird wiederum die fatalen Fehler in eine Warnung, das ist mehr oder weniger das, was Sie vorgeschlagen. Wenn
die
genannt wird,$@
enthält die Zeichenfolge übergeben, um es.InformationsquelleAutor der Antwort Jon Ericson
Tut es Falle
$SIG{__DIE__}
? Wenn es funktioniert, dann ist es mehr lokale als Sie sind. Aber es gibt ein paar Strategien:Können Sie evozieren das Paket und überschreiben sterben:
Wenn nicht, kann Falle. (schauen Sie für $SIG auf der Seite, markdown ist nicht Umgang mit den vollständigen link.)
Haben Sie vielleicht zum Scannen der Bibliothek, finden Sie eine sub, die es immer Anrufe, und verwenden, dass Sie Ihren laden
$SIG
handler durch überschreibenthat
.Oder außer Kraft setzen, ein builtin, dass es immer Anrufe...
Wenn alle Stricke reißen, können Sie dem Pferd die Peitsche in die Augen mit diesem:
Diese überschreiben sterben weltweit, der einzige Weg, Sie können Holen Sie sich zurück
die
ist, ihn zu behandeln, alsCORE::die
.Einige Kombination dieser funktioniert.
InformationsquelleAutor der Antwort Axeman
Obwohl ändern
die
um nicht zu sterben hat spezifische Lösung wie in den anderen Antworten, im Allgemeinen, Sie können immer überschreiben Subroutinen, die in anderen Paketen. Sie ändern sich nicht, die ursprüngliche Quelle überhaupt.Erste, laden Sie die Originalverpackung so erhalten Sie alle von der ursprünglichen Definitionen. Einmal das original befindet sich im Ort, Sie können neu die lästige Unterprogramm:
Können Sie auch Ausschneiden und einfügen die ursprüngliche definition und zwicken, was Sie brauchen. Es ist keine tolle Lösung, aber wenn Sie können nicht ändern, die ursprüngliche Quelle (oder wollen, um etwas zu versuchen, bevor Sie das original ändern), kann es funktionieren.
Außer, dass, können Sie kopieren Sie die original-Quellcode-Datei in ein separates Verzeichnis für Ihre Anwendung. Da Sie Steuern das Verzeichnis, Bearbeiten Sie die Dateien in es. Sie ändern, kopieren und laden Sie es, indem Sie das Verzeichnis, in dem Perl-Modul-Suchpfad:
Ihre Kopie sticks um, auch wenn jemand updates der original-Modul (auch wenn Sie möglicherweise, die änderungen zu mergen).
Rede ich über diese ziemlich viel in Mastering Perl, wo ich zeigen einige andere Techniken, das zu tun diese Art der Sache. Der trick ist, um nicht zu brechen die Dinge noch mehr. Wie Sie nicht zu brechen Dinge hängt davon ab, was Sie tun.
InformationsquelleAutor der Antwort brian d foy