Java - Finden Sie den ersten Grund für eine Ausnahme
Brauche ich, um zu prüfen, ob eine Ausnahme wird verursacht durch ein Datenbank-problem. Ich erhalte eine Ausnahme, und überprüfen, ob die Ursache " enthält die "ORA" Zeichenfolge und zurück, (so etwas wie "ORA-00001"). Das problem hier ist, dass die exception die ich erhalte ist geschachtelt in anderen Ausnahmen, wenn ich also nicht herausfinden, wenn es eine oracle-exception, ich habe zu prüfen, in die Ursache für die exception und so weiter.
Gibt es eine bessere Möglichkeit, dies zu tun? Gibt es eine Möglichkeit zu wissen, die erste Ursache (die tief geschachtelte Ausnahme) von einer bestimmten Ausnahme?
Mein Aktueller code sieht wie folgt aus:
private String getErrorOracle(Throwable e){
final String ORACLE = "ORA";
if (e.getCause() != null && e.getCause().toString().contains(ORACLE)){
return e.getCause().toString();
} else if(e.getCause() != null){
return getErrorOracle(e.getCause());
} else {
return null;
}
}
InformationsquelleAutor der Frage Averroes | 2009-11-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur durchqueren die Ausnahme Kette, bis Sie zu einer Ausnahme ohne Ursache, und dann nur zurück, dass die Nachricht, wenn Sie wollen, das Letzte.
Ihre Funktion wird nur die erste Ursache, wenn es einen gibt.
Können Sie sich möglicherweise bei der Suche nach der ersten Ursache in Ihrem Paket obwohl, wie die tatsächliche tiefste können eine oracle-Ausnahme, die ist hilfreich, aber es sei denn, Sie können sehen, wo Sie das problem geschaffen, Sie haben eine harte Zeit, es zu beheben.
InformationsquelleAutor der Antwort James Black
In die Interessen der nicht das Rad neu erfinden, wenn Sie Apache Commons Lang, dann schauen Sie auf ExceptionUtils.getRootCause().
Lohnt es sich, darunter eine Bibliothek, die nur für das? Vielleicht auch nicht. Aber wenn Sie bereits haben es auf Ihrem classpath, es ist für Sie, und beachten Sie, dass es einige Dinge, die eine 'naive' Implementierung möglicherweise nicht tun (z.B. Umgang mit Zyklen in der Ursache-Kette... ugh!)
InformationsquelleAutor der Antwort Cowan
Wenn Sie bereits auf Guave als Throwables.getRootCause() kommt zur Rettung.
InformationsquelleAutor der Antwort Nándor Krácser
Wahrscheinlich ein bisschen overkill für Ihre Benutzung, aber ich denke, es ist sauberer (und wiederverwendbare)
InformationsquelleAutor der Antwort vickirk
Ich denke, dass jeder Fehler, der geworfen wird, die von oracle eingewickelt in eine SQLException (bitte jemand korrigieren Sie mich, wenn falsch). Sobald Sie zugegriffen haben, die SQLException, die Sie sollten in der Lage sein zu rufen
getErrorCode()
Ruft die Hersteller-spezifische Ausnahme-code für das SQLException-Objekt.
Lassen Sie mich wissen, wenn das funktioniert, wie ich es noch nie versucht 🙂
Karl
InformationsquelleAutor der Antwort Karl
Könnte man verbessern Sie Ihre code-Kontrolle für SQLException
Außerdem denke ich, dass in Oracle "errCode" enthält die Nummer des entsprechenden ORA-nnnn
InformationsquelleAutor der Antwort JuanZe
können Sie die getStackTrace() von der Throwable-Klasse. Dies würde Ihnen den Stapel von StackTraceElements, mit zu arbeiten. Sie können Durchlaufen die StackTraceElements[] zu finden, "ORA" - string.Lassen Sie mich wissen, wenn Sie benötigen, ein Beispiel.
InformationsquelleAutor der Antwort coolest_head
Wenn die Ausnahme ausgelöst wird, wird immer von einem bestimmten Typ, wie OracleException, die man fangen kann nur die Ausnahme.
Beispiel:
Dies würde nur gelten, wenn es bestimmte Oracle-exceptions geworfen. Ich weiß nicht viel über Oracle, so dass, bevor Sie diese, werden Sie wahrscheinlich wollen, um herauszufinden, ob das ist, was passiert.
InformationsquelleAutor der Antwort spork
auf 28-01-2015 , ich habe nicht in der Lage mein problem zu lösen mit einem der oben genannten Lösung, also meine Empfehlung ist zu verwenden :
Ps: ich benutze es auf android.
InformationsquelleAutor der Antwort Fasiha