Stellen Sie sich den folgenden Code als Teil eines Programms (Java):Ausnahmen Chaining, Ausnahmen fangen neue werfen
function z(){
try{
//some code here, that might throw exceptions.
}catch (SomeException | SomeOtherException e){
//some exception handling here.
}
function y(){
z();
}
function x(){
y();
}
Und stell dir vor, dass die Funktionen x und y nicht wie vorgesehen ausgeführt werden, wenn Ausnahmen SomeException oder SomeOtherException werden innerhalb der Funktion z geworfen. Wir wollen unseren Code so schreiben, dass die Funktionen x und y wissen, dass Exceptions in die Funktion z geworfen wurden und sie entsprechend reagieren. Was ist der beste Weg, dies zu tun?
function z() thrown FunctionZFailedException{
try{
//some code here, that might throw exceptions.
}catch (SomeException | SomeOtherException e){
throw new FunctionZFailedException();
}
}
function y() throws FunctionYFailedException{
try{
z();
}catch (FunctionZFailedException e){
throw new FunctionYFailedException();
}
}
function x(){
try{
y();
}catch (FunctionYFailedException e){
//Do something, like alerting user that something went wrong.
}
}
Ist das zu groß, das heißt neue Ausnahmen mit dem alleinigen Zweck der „Weiterleitung“ andere Ausnahmen bis zu einem höheren Niveau zu erklären?
Ich denke, wir könnten SomeException und SomeOtherException auch einfach fliegen lassen und sie innerhalb der Funktion x abfangen. Aber imo, das weniger lesbaren Code wettmachen könnte,
zum Beispiel, wenn die Ausnahmen gefangen in Funktion z sind SQLException und NoSuchAlgorithmException, und Funktion y ist eine login() -Funktion. Dann würde die Funktion x versuchen, login() aufzurufen und entweder eine SQLException | NoSuchAlgorithmException, wenn diese Ausnahmen einfach auf die höchste Ebene fliegen oder eine LoginFailedException abfangen, wenn wir alle Ausnahmen sofort abfangen und sie neue Ausnahmen auslösen lassen. Es scheint, als ob das Abfangen einer LoginFailedException für besser lesbaren Code sorgt.
Imo beide Wege haben ihre Nachteile (weniger lesbaren Code vs Einführung vieler Ausnahmen) und ich frage mich, wie ähnliche Fälle in der Regel von erfahrenen Java-Programmierer behandelt werden.
Jede allgemeine Gedanken über Ausnahmen auch dank geschätzt Jungs
In den meisten Fällen möchten Sie die ursprüngliche Ausnahme ("cause") einschließen: 'catch (FunctionZFailedException e) { neue functionYFailedException (e) werfen; } ' – JimmyB