Overhead mit Ausnahme vs Throwable in Java
Frage
Ich weiß
throw new Exception();
hat einen ziemlich großen Overhead, da sie eine vollständige stacktrace schafft usw.
Does
throw new Throwable();
präsentieren das gleiche Problem? Ist dieses Verhalten geerbt oder nicht werfen ein Throwable hat einen kleineren (o no) Overhead?
Bearbeiten
Von einer Analyst Sicht ein Benutzer ein falsches Kennwort Einfügen ist eine Ausnahme von der normalen Reihenfolge der Ausführung eines Programms. Also, wenn ich:
public Session newSession() {
validate_user_and_password();
}
ein UserNotValidException werfen würde klingen richtig von einem Analysten Sicht.
Wiederkehrende null
oder 0
klingt einfach falsch, wenn Ihr Code ziemlich gut Abstraktion hat. Ich wollte nur wissen, ob ich tatsächlich diese im Code implementieren könnte, oder wenn ich würde es verlassen, nur um Theorie.
Es gibt einen guten Unterschied zwischen Programmier-Point-of-View-Ausnahme und Analytiker-Point-of-View-Ausnahme.
Hinweis: Ich habe ein wirklich einfaches und dummes Beispiel gegeben haben, das ist nicht ganz mein Fall
.
Anmerkung 2:. Ich weiß null
Rückkehr würde die normale Sache sein, aber ich bin haben erforderlich richtig abstrahiert und OO-Code, und ich persönlich keinen Schaden in dieser sehe
Lösung
Throwable
schafft auch einen Stacktrace, wenn es erstellt wird. Aus der Java Dokumentation für Throwable
:
throwable enthält eine Momentaufnahme des Ausführungsstapels ihres Gewinde zum Zeitpunkt sie erstellt wurde.
So in Bezug auf Overhead in Bezug auf einen Stacktrace zu schaffen, sollte es kein Unterschied zwischen Exception
und Throwable
sein.
Wenn Sie Ausnahmen für „außergewöhnliche Ereignisse“ verwenden (wie Sie sein sollte), dann sollten Sie nicht werden, um mit den Overhead eines Stacktrace besorgt. Ein außergewöhnliches Ereignis tritt selten Code in ausgeführt wird. So Ausnahmen sollten nicht die Leistung des normalen Code in irgendeiner signifikanten Weise auswirken.
Andere Tipps
Nein, müssen Sie Ihre eigene Unterklasse diesen Effekt zu vermeiden.
Exception ex = new Exception() {
@Override public Throwable fillInStackTrace() {
return this; // and do nothing else
}
};
Dies erzeugt eine Instanz der Ausnahme, dass der Stack-Trace nicht füllen wird (die Schaffung von Ausnahmen Delegierten fillInStackTrace
, um tatsächlich den Stack-Trace zu füllen) und ist somit günstig zu erstellen.
Mit JIT-Kompilierung ist es eigentlich immer noch nicht der Fall, dass es eine Menge belauscht ist ein Exception
in Java zu werfen. Aber ein Throwable
werfen ist nicht viel anders, da man dort einen Stack-Trace auch bekommen.
Wenn Sie interessiert sind, gibt es eine sehr interessante Arbeit "Effiziente Java Exception Handling in Just-in-Time-Kompilierung" ( link ). Kein Licht lesen, aber sehr informativ.
Sie sollten niemals werfen oder fangen Throwable.
Der Umfang der Ausnahme ist viel zu groß.
Wie bereits erwähnt, sollten Ausnahmen nur verwendet werden, wenn erforderlich, das heißt: in Ausnahmefällen und sollen spezifisch auf die Situation, die sie hervorgebracht hat. Davon abgesehen, impliziert eine Vielzahl von Ausnahmen, wie Throwable
einen OutOfMemoryException
zu kontrollieren. Ein Fehler in dieser Größenordnung kann nicht von (leicht) wiedergefunden wird und soll nicht vom Entwickler behandelt werden.
Throwable
ist Elternklasse von Exception. so Exception class
von Throwable
geerbt.
Sie können auf den Quellcode der beiden Klassen suchen, die Exception
alles tun, nicht die gleichen Konstrukteurs wie Throwable
. All das Fleisch und damit Aufwand, lebt in Throwable
.
Auch wenn Exception
einigen zusätzlichen Aufwand einführen hat es eine klare Überoptimierung zu nutzen Throwable
stattdessen wäre. Verwenden Sie das richtige Werkzeug für den Job, nicht kooptieren das falsche Werkzeug, nur weil es leichter ist.
java.lang.Exception
erstreckt java.lang.Throwable
, so dass es die gleiche Overhead ist. Von der Javadoc :
Die Throwable-Klasse ist die Superklasse aller Fehler und Ausnahmen in der Programmiersprache Java. Nur Objekte, die Instanzen dieser Klasse (oder einer ihrer Unterklassen) sind durch die Java Virtual Machine geworfen oder kann von der Java-throw-Anweisung geworfen werden. In ähnlicher Weise nur diese Klasse oder einer ihrer Unterklassen kann das Argument Typ in einer catch-Klausel sein.
Instanzen von zwei Unterklassen, Fehler- und Exception, werden üblicherweise verwendet, um anzuzeigen, dass Ausnahmesituationen aufgetreten sind. Typischerweise werden frisch diese Fälle im Rahmen der Ausnahmesituation geschaffen, um relevante Informationen (wie Stack-Trace-Daten) enthält.