Warum ist Throwable.fillInStackTrace () - Methode public? Warum würde jemand verwenden?
Ich bin neugierig, warum ist die Methode fillInStackTrace
von java.lang.Throwable
öffentlichkeit?
Diese Methode ersetzt original-stack-trace mit, dass von dem Ort, es heißt, das entfernen der benötigten Informationen zu lokalisieren Ausnahme. Es könnte verwendet werden, für die Verschleierung, aber ohne viel Aufwand, da die neuen stack-trace zu lenken, um die Verschleierung von code. Der bessere Weg wäre, einfach ausblenden Ausnahme oder werfen Sie die neue.
Aber ich kann nicht herausfinden, jede angemessenen Fall für den Aufruf dieser Methode auf bestehende Throwable
. Die Frage ist also: warum diese Methode ist öffentlich? Ist da irgendein Sinn hinter?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Grund ist für die Leistung. Werfen und fangen einer Ausnahme ist Billig, das teuerste Teil ist Füllung in der stack-trace. Wenn Sie überschreiben
fillInStackTrace()
nichts zu tun, erstellen Sie eine Ausnahme wird auch Billig.Mit Billig-Ausnahmen können Sie Ausnahmen für flow control, die machen den code besser lesbar in bestimmten Situationen; Sie können Sie verwenden, wenn bei der Implementierung von JVM-Sprachen, wo Sie brauchen,mehr advanced flow control, und Sie sind nützlich, wenn Sie schreiben eine Akteure Bibliothek.
protected
hätte Arbeit für diesen Anwendungsfall.public
. Als jtahlborn erklärt in Ihrer Antwort, es ist öffentlich, so dass ein Aufrufer zurückgesetzt werden kann der stack-trace, z.B. vor dem auslösen einer Ausnahme konstruiert anderswo.Einer möglicherweise legitimen Gebrauch ist die Schaffung einer Ausnahme von einem anderen Ort aus, wo Sie tatsächlich werfen. Zum Beispiel, vielleicht haben Sie eine Anwendung, wo Sie eine plugin-Anlage für die Erzeugung von benutzerdefinierten Ausnahmen. Da der stacktrace ist gefüllt auf Bau, die trace der exception enthalten möglicherweise irreführende Informationen (es werden Anrufe in das eigene exception-Fabrik). also, Ihre Anwendung nennen würde
fillInStackTrace()
auf die Ausnahme nach generation durch den custom factory, um eine genauere stack-trace für den letztendlichen Empfänger der Ausnahme.Diese abgelehnt bug zeigt an, dass Sie nicht die einzige, die verwirrt durch die Notwendigkeit für diese Methode.
Einen legitimen Anwendungsfall für Throwable.fillInStackTrace() ist für nicht-lokale Ablaufsteuerung:
Zum Beispiel, in meinem TrueZIP Rahmen, ich benutze eine komplexe Kette von decorators für die Datei-system-Controller. Eine der Steuerungen ist in dieser Kette ist eine Instanz der Klasse FsLockController. Dieses Objekt ist verantwortlich für die Verwaltung einer ReentrantReadWriteLock für das Datei-system. Nun wird ein Datei-system-controller irgendwo tiefer in diese Kette könnte erkennen, dass ein write-lock ist erforderlich, aber nur einen lese-lock erworben wurde, durch die FsLockController. Da können Sie kein upgrade für eine read-Sperre auf eine schreib-Sperre ohne dead-locking, eine exception muss geworfen,, die passiert zu sein eine Instanz der Klasse FsNeedsWriteLockException. Die Dekoration FsLockController dann fangen diese Ausnahme, lassen Sie die read-lock und erwerben die write-lock, bevor Sie den Vorgang wiederholen, wieder.
Diese Art der nicht-lokalen Ablaufsteuerung funktioniert eigentlich sehr gut, aber es ist eine Sache zu Bedenken: das Werfen und fangen einer Ausnahme ist Billig, aber der Befüllung oder Prüfung der stack trace ist teuer. Jetzt, da diese spezielle exception-Typ ist ausschließlich geworfen und gefangen in dieser Datei-system-controller-chain, ich brauche nicht einen stack-trace an alle und so kann ich sicher überschreiben Throwable.fillInStackTrace() mit einem leeren Methodenrumpf, um zu unterdrücken, um diese teure operation.
Source-code für die Basis-Klasse dieses Ausnahme-Typ gesehen werden kann hier.
Hier ist eine vernünftige Fall: zum ausblenden von details der Anwendung von nicht autorisierten Benutzer. Zum Beispiel wollen Sie nicht aussetzen stack-trace der exception geworfen, wenn der Lizenzschlüssel abgelaufen ist, denn es vereinfacht die hacker-Arbeit.
Vielleicht wollen Sie fangen eine Ausnahme und werfen eine neue, nicht Kapseln von Ihrer bisherigen Ausnahme. getStackTrace von den Gefangenen ein, und setzen Sie den stackTrace für die neue.
Dies würde auch funktionieren, wenn man ein singleton Ausnahme, einmal instanziiert wie:
geworfen wird mehrere Male. Dies würde den stackTrack zu etwas, das in Bezug auf die Ausnahme gefangen werden, ohne die Notwendigkeit zu teuer erstellen Sie eine neue Ausnahme, jedes mal. Ich denke, das ist, wie Scala tut Ihr continue-und break-Konstrukte.
Statische Ausnahmen kann schwierig sein, wenn Sie geworfen werden können, mehrere Zeiten gleichzeitig (D. H. in threads)
Einen ähnlichen Frage liefert die Antwort.
Gemäß der JLS standardmäßig ein stacktrace ist ausgefüllt, wenn die Ausnahme ist, instanziiert. Jedoch, es gibt Zeiten, möchten Sie vielleicht, um die "reset" - Stapel, um etwas mehr nützlich-Position, wenn Sie erneute auslösen.
Erlauben, diese Funktionalität haben wir fillInStackTrace()
BEARBEITEN
Gut, heute habe ich gelernt, die Java-standard-Bibliothek Spezifikation entfernt wurde von der JLS nach der revision 1. Wie das Vorwort zur zweiten Auflage Staaten:
Als solche, die wir wirklich brauchen, um einen genaueren Blick auf die javadoc, um dies herauszufinden. Die API ist hier überraschend Locker. Alle relevanten Teile sind aus dem Kopf, in dem es heißt:
Und java.lang.Throwable.printStackTrace() ist
Meine überzeugung ist, dass dies zu ermöglichen VM implementors zu bieten, was die meisten performante/passende Umsetzung für Ihren Kontext. Mit diesem Kontext, dass die explizite fillInStackTrace() public macht sogar noch mehr Sinn.
Standardmäßig werden die Virtuellen Maschinen bietet Sie mit die beste Mühe backtrace Lage. Machen fillInStackTrace() public ermöglicht es Entwicklern, verfeinern Sie weiter.
--
einer Endredaktion 🙂
Ich es geschafft, die Spur eine Verbleibende link auf die relevanten bits der JLS Erste Ausgabe und ich würde gerne anbieten einen weiteren Grund, weshalb die Methode ist öffentlich. Es ist für besser oder schlechter, eine gemeinsame Erklärung in Java.
Es war immer so.
fillInStackTrace
?