Wann sollte Throwable statt neue Exception verwendet werden?
Frage
Gegeben: Throwable
ist Exception
die übergeordnete Klasse
Wenn ich Texte lese auf eigene Faust ‚Ausnahmen‘ zu schreiben, ich sehe Beispiele für Throwable
im catch
Block verwendet werden und andere Texte zeigen new Exception()
im catch
Block verwendet werden. Ich habe noch eine Erklärung, um zu sehen, wenn man jeweils verwendet werden soll.
Meine Frage ist, sollte bei der Verwendung und wann sollte seine Throwable
new Exception()
verwendet werden?
Im Innern des catch
oder else
Block entweder:
throw throwable;
oder
throw new Exception();
Lösung
(von Kommentaren) Das Problem, das diese erzogen ist, dass Ich brauche eine ‚Ausnahme‘ auf eine weitergeben Stück Code ein Mitarbeiter baut wenn eine Sammlung nicht gebaut bekommt.
In diesem Fall könnten Sie ein werfen wollen geprüfte Ausnahme . Sie könnten ein Exception
werfen, einen geeigneten bestehenden Unterklasse davon (mit Ausnahme RuntimeException
und ihre Unterklassen das ist nicht markiert ) oder eine benutzerdefinierte Unterklasse von Exception
(zB "CollectionBuildException
"). Sehen Sie sich die Java Tutorial auf Ausnahmen zu bekommen bis zu beschleunigen mit Java Ausnahmen.
Andere Tipps
Sie immer ein Exception
werfen (nie ein Throwable
). Sie fangen im Allgemeinen nicht Throwable
auch nicht, aber Sie können. Throwable ist die Super Exception
und Error
, so dass Sie Throwable
fangen würden, wenn man will nur Exception
s aber Error
s nicht fangen, das ist der Punkt es zu haben. Die Sache ist, Error
s sind in der Regel Dinge, die eine normale Anwendung nicht und nicht fangen sollte, so dass nur Exception
verwenden, wenn Sie einen bestimmten Grund haben Throwable
zu verwenden.
Sie sollen nicht wirklich eine Ausnahme fangen und einen neuen so allgemein wie „new Exception“ werfen.
Stattdessen, wenn Sie die Ausnahme zu sprudeln mögen nur Folgendes tun:
try {
// Do some stuff here
}
catch (DivideByZeroException e) {
System.out.println("Can't divide by Zero!");
}
catch (IndexOutOfRangeException e) {
// catch the exception
System.out.println("No matching element found.");
}
catch (Throwable e) {
throw e; // rethrow the exception/error that occurred
}
Es ist keine gute Praxis, wie ich glaube, eine Ausnahme zu fangen und eine neue Ausnahme anstelle des einen werfen, die Ihren Code-Block ausgelöst wurde, es sei denn, Sie eine nützliche benutzerdefinierte Ausnahme auslösen, die genügend Kontext, um die Ursache zu entziehen bietet von die ursprüngliche Ausnahme.
Nur zwei Stellen Sie das Wort Throwable
in Code sehen sollen:
public static void main(String args[])
{
try
{
// Do some stuff
}
catch(Throwable t)
{
}
}
und
public class SomeServlet extends HttpServlet
{
public void doPost(HttpRequest request, HttpResponse response)
{
try
{
// Do some stuff
}
catch (Throwable t)
{
// Log
}
}
}
Throwable ist eine Schnittstelle, keine Klasse. Zwei Klassen Throwable, Ausnahme- und Fehler verlängern.
Die Regel lautet: so genau wie möglich, um beim Abfangen von Ausnahmen - das heißt zum Beispiel Ausnahme statt Throwable und IOException statt Exception fängt
.Sie Fehler nicht fangen - Fehler sind Fehler. Befestigen Sie den Code statt.
Wenn Sie absolut alles zu fangen haben, verwenden Sie „fangen Throwable“, aber das ist schlechte Form.
throw new Exception();
ist man etwas sollte nie in einem catch-Block zu tun, aber Sie können zu werfen new SomeException(throwable);
zu tun haben, oder wollen statt throw throwable;
um (den vollständigen Stack-Trace zu bewahren) an die API entsprechen Ihre Methode, zB wenn es erklärt SomeException
zu werfen, aber Sie anrufen Code, die Sie vielleicht einen IOException
nicht werfen Sie Methode des throws
Klausel hinzuzufügen.
Der wohl häufigste Fall ist new RuntimeException(throwable);
zu vermeiden insgesamt eine throws
Klausel hat. Viele Leute werden Ihnen sagen, das ist ein schrecklicher Missbrauch, weil Sie überprüften Ausnahmen sollte verwenden. IMO sind sie falsch und Karomuster Ausnahmen ein Fehler in der Java-Sprache Design sind, die nur Ergebnisse in hässlich, wartbaren Code.
Wie ich es gehört, als Java zuerst herauskam, war die Theorie, dass Throwable könnte für die Übertragung der Kontrolle in anderen Fällen außer Ausnahmen verwendet werden. Ich habe es allerdings nie so gesehen verwendet (und das ist wahrscheinlich eine sehr gute Sache).
So einfach Exception fängt (oder besser noch, ein feinkörniges Ausnahme).
Throwable soll nur durch den Behälter oder die Hauptschleife des Programms gefangen werden. Die meiste Zeit Sachen unten Ausnahme zB Fehler fangen hinzufügen nicht viel Fähigkeit zu einem Programm, doch was kann man tun, wenn möglich, ein VirtualError andere Fehler geworfen werden. Nicht viel, außer Protokoll und weiter.
Alle Ausnahmen sind ein Problem, am Ende ... sagen Fehler sind Fehler alles bedeuten tun.
Fehler sind keine Fehler - sie sind Probleme, die die Host-VM erlebt, zB OutOfMemoryError. Ausnahmen sind ein Mittel, dass die aktuelle Operation benachrichtigt verwenden kann, dass es versagt und vielleicht eine Diagnose.
Im Allgemeinen würden Sie nicht Throwable werfen oder fangen. Insbesondere JVM Fehler (das erweitern Error ()) nicht bedeutet durch Benutzercode gefangen werden, wenn Sie seltsame System-Level-Arbeit tun.
Treat "Throwable" als Sprache Artefakt. Die „Exception“ Klasse genannt wird, weil es ist die, die von Programmierern verwendet werden soll, wenn sie einen Codeblock verlassen „außergewöhnlich“ wollen. - durch die normalerweise nicht verlassen oder einen Wert zurückgibt
Das schließt sowohl regelmäßige Fehlersituationen (durch „normale“ Ich meine, wie auf JVM Fehler gegen) und Orte, wo man Ausnahmen als Kontrollmechanismus verwenden.
Sie sollten nicht Ausnahmen als „Rückgabetyp“ entweder ...
Wenn die Bedingung, nach dem Sie werfen gemeinsam ist, verbringen Sie eine riesige Menge an Ressourcen, die Bedingung zu der Aufrufroutine zurückzukehren. Ausnahmen sind teuer zu bauen.
Ich habe Fälle gesehen, wo engen Schleifen, die Ausnahmen als „negative“ warf für z.B. ID Zuteilung, wird diese Routine etwa 99% der CPU-Zeit besetzt .. wenn statt konstant zu einer dokumentierten Rückkehr geändert, dies auf 25% gesunken.