In einem früheren Blog habe ich einige Möglichkeiten beschrieben, wie Sie sicherstellen können, dass Ihre Ressourcen richtig geschlossen werden. Die Beispiele, die ich gegeben habe, enthielten einen Fehler und können dazu führen, dass Ressourcen immer noch nicht richtig geschlossen werden (wie von
versuchen {
// hier etwas tun
} finally {
versuchen {
reader.close();
} catch(IOException e) {
log.info("Schließen schlägt fehl");
}
}
Wie Anonymous bereits sagte, besteht das Problem darin, dass das Schließen des Lesegeräts fehlschlagen kann, wenn alle Versuche erfolgreich waren. Das könnte bedeuten, dass auf einigen Betriebssystemen nicht alles in die Datei geschrieben wird. Und das muss natürlich an den Aufrufer unserer Methode zurückgemeldet werden. Aber das Werfen einer Exception in finally kann aus Gründen des Exception swallowing sehr gefährlich sein. Das hat mich zu der Schlussfolgerung gebracht, dass Sie Ressourcen nicht im finally-Block schließen sollten. Hier ist eine Implementierung, die meiner Meinung nach mit Ressourcen richtig umgeht:
versuchen {
// hier etwas tun
// Schließen Sie den Leser als letzte Anweisung.
reader.close();
} catch(Exception e) {
versuchen {
reader.close();
} catch(IOException closeFailed) {
log.warn("Jetzt ist es sicherer, nur die Ausnahme zu protokollieren, da es eine andere Ausnahme gibt, die wichtiger ist als diese.", closeFailed);
}
throw new CustomRuntimeException(e);
}
Der Umgang mit Lesern ist also noch komplexer, als ich ursprünglich dachte. Meiner Meinung nach rechtfertigt dies die Verwendung eines Vorlagenmusters, um sicherzustellen, dass mögliche Ausnahmen ordnungsgemäß behandelt werden... natürlich müssen Sie darauf achten, dass Sie keine Bugs implementieren, wie ich es in dem Vorlagenbeispiel in meinem vorherigen Blog getan habe ;-)
Verfasst von
Lars Vonk
Unsere Ideen
Weitere Blogs
Contact



