Compiler-Fehler Exceptions lieber throwen oder direkt catchen?

membersound

Bekanntes Mitglied
Hallo,

wo fängt man idR Exceptions ab? Immer direkt am Ort des Fehlers, also try-catch? Oder ist es generell besser sie so weit wie möglich weiterzu thrown und dann alle Fehler irgendwo global in einer Klasse zu behandeln?
Mir geht es vor allem darum, dass der Code übersichtlich bleibt, was für throw sprechen würde.

In meinem Beispiel müsste ich die Exceptions also in der mainclass MyControll abfangen. Ich sammel dort quasi alle im Programm anfallenden Ex (auch aus anderen Klassen) und behandle sie dort in der main zusammen.
Aber ist das richtig? Reicht man Exceptions gerne hoch. Oder doch lieber direkt vor Ort?

Danke

Code:
public class MyControll {
	public static void main(String args[]) {
		MyModel model = new MyModel("testfile.txt");
	}
}

public class MyModel {
	public MyModel (String file) throws FileNotFoundException, IOException {
		readFile(file);
	}

	private void readFile(String file) throws FileNotFoundException, IOException {
		LineNumberReader buffer = new LineNumberReader(new FileReader(file));

		//usw
	}
}
 
Wenn du sie an Ort und Stelle sinnvoll behandeln kannst, dann behandle sie. Ansonsten gibst du Sie weiter, bis du darauf sinnvoll reagieren kannst.

Anmerkung nutze besser Java-Tags anstatt Code-Tags.
 
ein eleganter Weg ist noch
Java:
} catch (..) {
  throw new RuntimeException(..);
}
das ist einerseits die Variante des Weiterreichens, aber ohne die oft als unnötig empfundene throws-Deklaration bei Checked-Exceptions,
vor allem auch bei allen Aufrufern usw.

dazu gehört dann natürlich, dass wenn überhaupt irgendwo weiter oben dann allgemein alle Exceptions abgefangen werden,
mit catch(FileNotFoundException) kann man nichts mehr erreichen,

wenn man als Problem ansieht, dass irgendwo dann auch NullPointerExceptions abgefangen werden (auch eine Exception bzw. RuntimeException), dann nicht RuntimeException sondern eine eigene Subklasse verwenden und nur diese abfangen,



auch wenn man sich sicher ist dass eine Exception nie auftritt und man am liebsten einen leeren catch-Block schreiben würde
kann man um ganz genau zu sein so etwas schreiben, passt genauso gut
 
Zuletzt bearbeitet von einem Moderator:
Ja, die Frage ist eben, wann ist eine Behandlung vor Ort sinnvoll?

So gesehen wäre doch eine FileNotFoundException oder IOException beim FileRead immer sinnvoll direkt zu behandeln, weil sie ja eben genau da auftritt.

In welchem Fall würde ich diese Ex denn weiterreichen? Bzw wann würde das eben mehr Sinn machen im Gegensatz zum direkten trycatch?
 
So gesehen wäre doch eine FileNotFoundException oder IOException beim FileRead immer sinnvoll direkt zu behandeln, weil sie ja eben genau da auftritt.
Wenn besispielsweise der Anwender eben gerade einen unbekannten Dateinamen eingegeben hat, könntest du diese Exception sinnvoll behandeln, indem du ihn einfach nochmal bittest, was vernünftiges einzutippen.

Wenn aber z.B. ein Server-Prozess seine Config-Datei nicht findet, oder die Partition für die Logdateien voll ist und deswegen eine Exception fliegt, kann man die nicht sinnvoll behandeln. Da hilft es nur, den Fehler zu loggen und irgendwo eine rotes Licht angehen zu lassen, damit sich jemand darum kümmert.

Nach meiner Erfahrung lassen sich checked Exception nur in sehr wenigen Ausnahmen direkt sinnvoll behandeln.
 
OK ich merke schon, das muss man dann individuell entscheiden...

Nochmal eine Frage zu Exceptions in Java 7:
Java:
catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

Netbeans schlägt mir multicatch vor. Wenn ich das aber mache, bekomme ich einen Fehler:
Java:
catch (FileNotFoundException | IOException ex) { //Alternatives in a multi-catch statement cannot be related by subclassing
            ex.printStackTrace();
        }

Warum schlägt mir NB das denn dann vor?
Also möchte eigentlich nur wissen: mache ich was falsch beim multicatch, oder ist das ein Bug und NB sollte mir das eigentlich nicht vorschlagen?

Danke
 
Weil es unnötig ist. FileNotFoundException erbt von IOException. Dieses als Multi-Catch anzugeben ist somit nicht notwendig.
 
die korrekte Antwort auf die Frage lautet 😉 : ja, da macht wohl NB irgendwas falsch, hätte das nicht vorschlagen sollen

aber der Code vorher war auch unsinnig, insofern eine kleine Entlastung für NB
 
Macht afaik Eclipse auch falsch. Ist noch nicht so ausgereift und man muss halt beim Multicatch ab und zu unsinnige Exceptions entfernen.
 

Zurück
Oben