Хванете SQLExceptoin
след това използвайте SQLException.getSQLState()код>
и го сравнете, за да видите дали е това, което искате.
catch (SQLException ex) {
final String ss = ex.getSQLState();
//... blah blah ...
}
Вижте кодове за грешки на PostgreSQL за подробности за SQLState. (Докато повечето от категориите и кодовете на състоянието са стандартни за DB, не всички DB ги прилагат по един и същи начин и ги хвърлят по едно и също време, а повечето DB имат екстри, които са специфични за DB).
Няма начин да се хване изключение въз основа на SQLState. За съжаление трябва да го хванете и ако не е това, което искате, увийте го и го хвърлете отново. (Не хвърляйте отново без опаковане, губите оригиналния стек).
В JDBC 4 има подкласове на SQLException
като SQLNonTransientException
които можете да хванете, но само ако JDBC драйверът хвърли тези подкласове. Към момента на писане PgJDBC не ги поддържа и винаги просто хвърля SQLException
, така че ако се опитате да ги хванете, никога няма да хванете нищо. (Пачовете са добре дошли!).
В реалния свят обикновено се интересувате от редица различни условия на грешка и искате да правите различни неща въз основа на тях.
Нещо смътно като нетестваното, написано в прозореца:
} 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);
}
}
... където приложението ви знае да се свърже отново, ако види нулева връзка, и пази запис на транзакцията, която току-що е опитало, така че да може да я опита отново в цикъл, докато успее, ако попадне в блокиране или неуспешно сериализиране.
В действителност ще бъдете по-умни от това, като добавите ограничаване на скоростта на повторните опити и т.н. Това е само опростен пример.
За повече подробности прехвърлете изключението към PSQLExceptionкод>
след тестване за castability или го хванете като PSQLException
на първо място. След това получете подробности с:
ex.getServerErrorMessage()
което ви дава ServerErrorMessage
с подробни полета.