2016-04-19 16 views
0

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

+0

In den meisten Fällen möchten Sie die ursprüngliche Ausnahme ("cause") einschließen: 'catch (FunctionZFailedException e) { neue functionYFailedException (e) werfen; } ' – JimmyB

Antwort

0

Wenn Sie mit dem aktuellen Design von Verfahren glücklich sind z(), und Sie wollen Methoden y() und x() zu „wissen“, dass etwas Schlimmes in z() passiert ist, man dann kann z() die Ausnahme nach dem Schlucken erneut auslösen.

public void z() { 
    try { 
     // some code here, that might throw exceptions. 
    } catch (SomeException | SomeOtherException e) { 
     // handle the exception and then rethrow it 
     logger.log("An exception happened in z()."); 
     throw e; 
    } 
} 

public void y() { 
    try { 
     z(); 
    } catch(Exception e) { 
     // handle problem with z() and rethrow the exception 
     logger.log("An exception happened when calling z()."); 
     throw e; 
    } 
} 

public void x() { 
    try { 
     y(); 
    } catch(Exception e) { 
     // handle problem with y() 
     logger.log("An exception happened when calling y()."); 
    } 
} 
1

wenn Sie an Ihrem Code suchen (und die Namen der Methoden und Ausnahmen) herauszufinden, ob die Methoden und ihre geworfenen Ausnahmen auf derselben Abstraktionsebene sind.

Wenn Sie eine getInputStream() -Methode haben, wäre die entsprechende Ausnahme eine IOException. Wenn Sie diese Methode in Ihrer getDatabaseConnection() aufrufen, sollten Sie die IOException abfangen und eine SQLException auslösen. Und wenn Sie diese Methode für Ihre saveCustomerToDatabase() -Methode benötigen, sollten Sie etwas wie eine ProcessFailedException auslösen.

Ich bin kein großer Fan von Javadocs schreiben, aber manchmal sollten Sie sich fragen: Wäre ich in der Lage, gute Javadoc für diese Methode und ihre Ausnahmen in der gleichen Sprache (dh Fachsprache, Geschäftssprache usw.) zu schreiben.) Sie werden Probleme haben, ein Javadoc für eine saveCustomerToDatabase() -Methode zu schreiben, wenn es eine IOException auslöst.

+0

Ich neige dazu, -1 für" Ich bin kein großer Fan von Schreiben Javadocs "... – JimmyB

+0

und ich würde mich nicht beschweren – EasterBunnyBugSmasher

+0

Slipped auf meiner Maus, klickte" +1 "jetzt. - Gute Antwort :) – JimmyB