Java von den Grundlagen bis zum Profi — Folge 7
Behandeln von Fehlern mit Ausnahmen und Versuchen mit Ressourcen
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Datei-, Netzwerk- und Eingabewerte können jederzeit fehlschlagen. Die Ausnahme- und Ressourcenverwaltungssyntax von Java wird verwendet, um Fehler zu verbreiten und Ressourcen auf jedem Pfad zu schließen.
Übergeben von Ausnahmen
public Settings loadSettings(Path path) throws IOException {
String json = Files.readString(path);
return parser.parse(json);
}
Erzwingen Sie nicht, dass eine Ausnahme intern ausgeblendet wird, wenn der Aufrufer entscheiden muss, wie die Ausnahme wiederhergestellt werden soll. Beim Hinzufügen von Kontext müssen Sie die ursprüngliche Ausnahme als Ursache beibehalten.
try {
settings = loadSettings(path);
} catch (IOException error) {
logger.warn("settings load failed", error);
settings = Settings.defaults();
}
Fangen Sie nur Ausnahmen ab, die behandelt werden können. Wenn Sie alle Ausnahmen abfangen und nichts unternehmen, können selbst tatsächliche Fehler wie gewohnt auftreten.
try-with-resources
public List<String> readLines(Path path) throws IOException {
try (BufferedReader reader = Files.newBufferedReader(path)) {
return reader.lines().toList();
}
}
Wenn Sie ein Objekt erstellen, das AutoCloseable in Klammern implementiert, wird close am Ende des Blocks aufgerufen. Dateihandles werden sowohl auf normalen Rückgabe- als auch auf Ausnahmepfaden bereinigt.
Überprüfte Ausnahmen und Laufzeitausnahmen
Überprüfte Ausnahmen zeigen, ob sie per Methodendeklaration oder Catch behandelt werden. Laufzeitausnahmen wie IllegalArgumentException werden häufig bei ungültigen Aufrufverträgen oder Programmierfehlern verwendet.
Welches der beiden ist nicht unbedingt besser, aber das Kriterium ist, ob es sich um einen Fehler handelt, den der Anrufer beheben kann.
Nach Abschluss des Status ersetzen
Settings loaded = loadSettings(path);
currentSettings = loaded;
Wenn Sie einen komplett neuen Wert erstellen und in das Feld eingeben, bleiben die bestehenden Einstellungen auch bei einem Ladefehler erhalten. Bei der Gestaltung von Ausnahmen geht es nicht darum, viele Fänge zu erzeugen, sondern darum, zu bestimmen, wie Ressourcen und Objektstatus im Falle eines Fehlers erhalten bleiben.