Chytit SQLExceptoin
pak použijte SQLException.getSQLState()
a porovnejte to, abyste zjistili, zda je to to, co chcete.
catch (SQLException ex) {
final String ss = ex.getSQLState();
//... blah blah ...
}
Viz Chybové kódy PostgreSQL pro podrobnosti SQLState. (Zatímco většina kategorií stavů a kódů je standardní napříč databázemi, ne všechny DB je implementují stejným způsobem a vyvolávají je ve stejnou dobu a většina DB má doplňky, které jsou specifické pro DB).
Neexistuje způsob, jak zachytit výjimku na základě SQLState. Musíte to, bohužel, chytit, a pokud to není to, co chcete, zabalte to a znovu to vyhoďte. (Neházejte jen tak bez obalu, ztratíte původní balíček).
V JDBC 4 existují podtřídy SQLException
jako SQLNonTransientException
které můžete zachytit, ale pouze pokud ovladač JDBC vyvolá tyto podtřídy. V době psaní PgJDBC je nepodporuje a vždy jednoduše vyvolá SQLException
, takže pokud se je pokusíte chytit, nikdy nic nechytíte. (Záplaty jsou vítány!).
V reálném světě vás obvykle zajímá řada různých chybových stavů a chcete na jejich základě dělat různé věci.
Něco nejasně jako netestované, napsané v okně:
} catch (SQLException ex) {
final String ss = ex.getSQLState();
if (ss.equals("40001") || ss.equals("40P01")) {
/* It is a serialization failure or a deadlock abort. Retry the tx. */
retry_transaction = true;
} else if (ss.startsWith("08") || ss.startsWith("53")) {
/* It is a connection error or resource limit. Reconnect and retry. */
try {
conn.close();
} catch (SQLException ex) {
logger.log("Error closing suspected bad connection after SQLState " + ss, ex);
}
conn = null; /* App knows to reconnect if it sees a null connection */
retry_transaction = true;
} else {
throw new MyAppException(ex);
}
}
... kde vaše aplikace ví, že se má znovu připojit, pokud zaznamená nulové připojení, a uchovává záznam o transakci, o kterou se právě pokusila, aby ji mohla opakovat ve smyčce, dokud neuspěje, pokud dojde k uváznutí nebo selhání serializace.
Ve skutečnosti byste byli chytřejší než tohle, přidali byste omezení rychlosti opakování atd. Toto je jen zjednodušený příklad.
Další podrobnosti získáte odesláním výjimky do PSQLException
po testování na castability, nebo to zachytit jako PSQLException
na prvním místě. Podrobnosti pak získáte pomocí:
ex.getServerErrorMessage()
což vám poskytne ServerErrorMessage
s podrobnými poli.