Werfen Sie eine Verknüpfte Liste von Ausnahmen in Java
Ich habe eine Funktion, die Schleifen, während etwas zu tun, könnte eine exception werfen. Sieht ungefähr so aus:
public void myFunction() throws MyException {
while(stuff) {
try {
DoSomething() //throws an exception
}
catch (Exception ex) {
throw new MyException(some, stuff, of, mine, ex);
}
}
}
Den Fehler verursacht die Ausnahme ist erstattungsfähig. Es kann so etwas wie ein SQL-Fehler in einem einzigen update-Anweisung, wo die while-Schleife führt eine Reihe von update-Anweisungen. Oder ein parsing-Fehler in einem einzigen Stück von Daten, wobei die Schleife ist die Verarbeitung mehrerer Daten. Ich übergeben zu müssen, die Ausnahme weiter oben in der Kette, so dass der GUI-Teil des Programms kann es verarbeiten, verarbeiten ihn und leiten die Fehler an den Benutzer. Aber ich will nicht zu töten, die Schleife in dieser bestimmten Funktion. Die anderen Dinge, die es tut vielleicht nicht ungültig. Der Fehler, der die Ausnahme verursacht hat, könnte nicht fatale Folgen für die Funktion.
Also meine Frage ist: Ist es eine akzeptable Praxis zu bauen Linklisten von benutzerdefinierten Ausnahmen (jede Ausnahme ist ein Knoten, und die Ausnahme, die ausgelöst wird der Kopf der Liste) und dann werfen Sie den Kopf der Liste (falls vorhanden), sobald die Schleife beendet wird?
Hat sich schon mal jemand gesehen, der das gemacht? Kann jemand denken, mögliche Probleme dabei? Kann jemand denken, der andere, bessere Möglichkeiten zur Bewältigung der root-problem: die brauchen um darauf zu verzichten, mehrere unterschiedliche exceptions mit heraus verlassen der Funktion, bis es fertig ist?
Hier ist ein Beispiel, wie die Verknüpfung und werfen Sie umgesetzt werden könnten, sehr einfach:
public void myFunction() throws MyException {
MyException head = null;
while(stuff) {
try {
DoSomething() //throws an exception
}
catch (Exception ex) {
MyException tmp = new MyException(some, stuff, of, mine, ex);
tmp.next(head);
head = tmp;
}
}
if(head != null)
throw head;
}
- Durch die Art und Weise. Darüber hinaus verwenden Sie eine verknüpfte Liste hier ist oder nicht. Es gibt eine Klasse
java.util.LinkedList
bereit zu verwenden, so dass Sie nicht haben, um das Programm seine Funktion in Ihrem Element-Objekte (in diesem FallMyException
). - Ich bin mir dessen bewusst. Ich glaube nicht, Sie können es verwenden, in diesem Fall, denn die Liste muss geworfen werden und LinkedList ist nicht ein throwable.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine ersten Gedanken (außer ich habe es nicht gesehen) ist das eine Ausnahme ist potentiell ein Recht großes Objekt (mit stacktrace) und ich würde lieber nicht speichern eine Menge von Ihnen.
Ich würde stattdessen erstellen Sie eine Liste der fehlerhaften Parametern/Argumenten als Ausnahmen auftreten, und nach Beendigung der Schleife, werfen Sie eine eigene exception aufgefüllt, mit dieser Liste (sofern die Liste mehr als 0 Elemente). Das scheint eine überschaubare Weise der Umgang mit diesem Szenario.
throws CustomException
. Oh, bewusst sein, dassError
ist eine vorhandene Klasse injava.lang
. Sie würden vielleicht gerne den Namen ändern, um Verwechslungen zu vermeiden.Tun, die Sie wirklich brauchen, um zu werfen, alle die Ausnahmen? Wie erwarten Sie, um die einzelnen, unzusammenhängenden Ausnahmen behandelt werden? In der Regel in Fällen wie diesem, wird das system nur Fehler und mit ihm getan werden.
Wenn ja, möchten Sie vielleicht sammeln Sie nur die Fehlermeldungen und fügen Sie Sie in einer benutzerdefinierten
Exception
Klasse und werfen.Wenn diese Ausnahmen sind eigentlich nichts miteinander zu tun, so dass Sie nicht profitieren Sie von
get/setCause()
würde, dann würde ich eher sammeln diese Informationen in einerMyException
.E. g.
Update: Brian behandelt genau diesen Ansatz in eine nett Art und Weise. Ich würde entscheiden, dass anstelle 🙂
Tatsächlich werfen von Ausnahmen von einer solchen Funktion ist wohl nicht der richtige Weg zu umgehen, wenn es wird erwartet, dass es sein Fehler. Ich würde vorschlagen, entweder zurückgeben einer Liste (Array) aller Ausnahmen/Fehler auftrat, oder besser, einen Fehler-handler-Objekt an die Funktion, die mit den Ausnahmen. also:
Dieser lässt auch den Fehler-handler entweder sammeln die Fehler, um Sie für den Benutzer oder zu entscheiden, dass der gesamte batch-operation hat, für ungültig erklärt werden, weil einige Fehler und werfen eine Ausnahme von seinen eigenen Abbruch der Verarbeitung zu früh.
Wenn die Ausnahme, die ausgelöst durch
DoSomething();
könnte die sehr gleiche Methode, um zu werfen eine Ausnahme; das könnte ein problem sein. In anderen Worten, wennDoSomething();
wirft eine Ausnahme weil Sie hat nicht mit den vorherigen, es könnte unnecesarry Fehler zu behandeln.Ich denke, man kann einige passieren Rückruf oder Zuhörer zu der Methode oder eine Klasse variable und anstatt einen Wurf in die Liste, wie x4u haben.
In Java gibt es eine Schnittstelle für diese schon:
java.Bohnen.ExceptionListener
IMO, eine Ausnahme sollte sein, die Letzte Ressource, die Sie haben Umgang mit einem Fehler. Es sollte vermieden werden, wenn möglich. Also, möchten Sie vielleicht passieren die Fehler Beschreibung (erstellen von Fehler-codes, übergeben Sie die Nachricht, oder etwas sinnvolles) auf die GUI, und nicht die Ausnahme selbst.