2017-07-07 1 views
0

Ich suche eine Ausnahme FabrikJava Ausnahme Fabrik für höhere Ebene Ausnahmen

Ich habe einen Dienst zu erstellen, die zu verschiedenen Datenspeichern und diese Daten speichert eine Reihe von Ausnahmen werfen verbindet. Ich möchte diese Ausnahmen nicht an die Benutzer des Dienstes zurückgeben, sondern gebe stattdessen die Ausnahme höherer Ebene zurück, z. storeServiceTransientReadException

Bei der Verbindung mit dem Datenspeicher werde ich versuchen, fangen Wurfmuster; zB für eine Cassandra Verbindung:

public ResultSet safeExecute(Statement statement) throws StoreServiceException { 
    try { 
     return session.execute(statement); 
    } 
    catch(QueryExecutionException ex){ 
     log.error(ex); 
     StoreServiceException storeException = StoreServiceExceptionFactory.getTransientException(ex); 
     throw storeException; 
    } 

Im cassandra Beispiel ich die Fabrik soll eine Lese erstellen oder storeServiceException Ausnahme schreiben, je nachdem, ob die Ausnahme ist ein ReadFailureException, ReadTimeoutException, WriteFailureException oder WriteTimeoutException

Für andere Daten Ich möchte dem gleichen Muster folgen, dann müssen sich die Benutzer des Dienstes nur um die Dienstfehler und nicht um bestimmte Datenspeicherfehler kümmern.

Für die Fabrik Ich denke, etwas (in pseudo) entlang der Linien war:

public class ExceptionsFactory { 

public StoreServiceTransientException getTransientException(Exception ex){ 

    if ReadException 
     return StoreServiceTransientException("read exception ") 


    if WriteException 
     return StoreServiceTransientException("write exception ") 

} 

public StoreServiceNonTransientException getTransientNonException(Exception ex){ 

    if ReadException 
     return StoreServiceNonTransientException("read exception ") 


    if WriteException 
     return StoreServiceNonTransientException("write exception ") 


} 

Aber ich kann nicht viele Online-Beispiel dafür finden, die mir Sorgen. Es ist eine wirklich schlechte Idee? Ich sollte nur viel spezifischere catch-Blöcke haben, die die storeServiceException zurückgeben, die ich möchte?

+2

In Java ist es üblich, dass Klassennamen mit Großbuchstaben beginnen. 'StoreServiceTransientException' wäre eine schnelle, aber große Verbesserung – byxor

+0

@byxor guten Punkt - Tippfehler meinerseits, wenn ich versuchte, das Beispiel generischer – JJHolloway

Antwort

1

Es ist eine wirklich schlechte Idee? Meiner Meinung nach, ja. Das ist eine schlechte Idee. Der teure Teil der Verwendung von Exception (s) füllt den Stack-Trace. Wenn Sie das Exception, das Sie werfen, vorab erstellen und speichern, ist der Stack-Trace bedeutungslos (oder zumindest stark reduziert). Sie sind momentan nicht Protokollierung Stack-Traces, also würde ich auch

log.error(ex); 

zu

log.error("Caught exception: " + ex.getMessage(), ex); 

ändern Und ähnlich Ausnahmen mit der zugrunde liegenden Ursache instanziiert -

throw new storeServiceException("Exception in storage.", ex); 

und der Name sollte folgen normale Namenskonventionen. Java-Klassennamen beginnen mit einem Großbuchstaben - Ihre sieht wie eine Variable aus.

+0

mein schlechtes - das Beispiel zu aktualisieren und den Tippfehler entfernt. Danke für die Information! – JJHolloway