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();
War es hilfreich?

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 Exceptions aber Errors nicht fangen, das ist der Punkt es zu haben. Die Sache ist, Errors 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top