2016-10-30 3 views
-2

Ich habe einen Executor-Dienst, wo der Thread 2-3 mehrere Prozess für das Kontextobjekt ausgeführt wird, und protokolliert den Status in der Datenbank, nachdem jeder Prozess abgeschlossen ist. Der aktuelle Code definiert den try- und catch-Block nach jeder Protokollierungsanweisung, sodass alle Datenbankausnahmen behandelt werden können und der Worker zum nächsten Prozess übergeht.Datenbank Exceptions ordnungsgemäß behandeln

Gibt es ein Designmuster oder eine elegantere Art, dies zu tun. Der Code mehr try und catch-Blöcke innerhalb einer einzigen Funktion hat, die nicht lesbar

-Code-Snippet zum Beispiel ist:

completePayment() { 

validateAttribute1(); 
try { 
logResultToDatabase() ; 
//calls the entity manager to persist 
} 
catch (Exception e) { 
//do Nothing , continue to validateAttribute2 
} 
validateAttribute2(); 
try { 
logResultToDatabase() ;//calls the entity manager to persist 
} 
catch (Exception e) { 
//do Nothing , continue to doPayment 
} 
doPayment(); 
try { 
logResultToDatabase(); 
} 
catch (Exception e) { 
//do Nothing. 
} 
} 
+0

Sie den Code nicht beschreiben. Veröffentliche es. –

+0

@ jb-nizet - Ein Beispielcode-Snippet hinzugefügt, um das Problem zu erklären – user3601857

Antwort

0

Zunächst einmal sollten Sie nie Ausnahme fangen. Sie sollten nur die Ausnahme abfangen, die Sie behandeln möchten, und nicht eine nicht verwandte Ausnahme (z. B. eine NullPointerException, die durch einen Fehler im Code verursacht wird).

Sie haben gesagt, dass Sie mit Datenbankausnahmen umgehen wollen, daher ist die Ausnahme, die Sie fangen sollten, SQLException.

Wann kann eine SQLException ausgelöst werden?

  • , wenn es ein Fehler im Code ist, wie eine ungültige Abfrage beispielsweise
  • oder wenn es nicht möglich ist, mit der Datenbank

Im ersten Fall zu kommunizieren, ist die Ausnahme fängt nicht was Sie wollen, vor allem, wenn Sie die Ausnahme ignorieren: Sie sollten die Ausnahme besser an den aufrufenden Code weitergeben, damit der Fehler nicht unbemerkt bleibt und so schnell wie möglich behoben werden kann.

Im zweiten Fall ist es entweder egal, ob das Protokoll in die Datenbank geschrieben werden soll oder ob der Multi-Tep-Prozess sofort gestoppt werden soll, wenn ein Protokoll fehlschlägt.

Wenn Sie sofort anhalten möchten, sollten Sie die Ausnahme weiterleiten lassen.

Wenn es Ihnen egal ist, ob die Protokolle nicht geschrieben sind und trotzdem fortfahren wollen, dann ist das, was Sie haben, in Ordnung, außer es enthält viele Wiederholungen und ist nicht gut lesbar.

extrahieren So den Code ein Verfahren:

public void completePayment() { 
    validateAttribute1(); 
    logResult(); 

    validateAttribute2(); 
    logResult(); 

    doPayment(); 
    logResult(); 
} 

private void logResult() { 
    try { 
     insertResultIntoDatabase(); 
    } 
    catch (SQLException e) { 
     // not thrown to avoid interrupting the payment process 
     // but logged to be aware of the problems with the code or the DB 
     logger.warn("Exception writing result to the database, e); 
    } 
} 
Verwandte Themen