Fånga SQLExceptoin
använd sedan SQLException.getSQLSate()
och jämför det för att se om det är vad du vill ha.
catch (SQLException ex) {
final String ss = ex.getSQLState();
//... blah blah ...
}
Se PostgreSQL-felkoder för SQLState-detaljer. (Även om de flesta tillståndskategorier och koder är standard över DB:er implementerar inte alla DB dem på samma sätt och kastar dem samtidigt, och de flesta DB:er har extrafunktioner som är DB-specifika).
Det finns inget sätt att fånga ett undantag baserat på SQLState. Du måste, tyvärr, fånga den, och om det inte är vad du vill linda in och kasta om den. (Kasta inte bara om utan att linda, du förlorar originalstacken).
I JDBC 4 finns det underklasser av SQLException
som SQLNonTransientException
som du kan fånga, men bara om JDBC-drivrutinen kastar dessa underklasser. I skrivande stund stöder inte PgJDBC dessa, och kastar alltid helt enkelt SQLException
, så om du försöker fånga dem kommer du aldrig att fånga något. (Plåster är välkomna!).
I den verkliga världen är du vanligtvis intresserad av ett antal olika feltillstånd och vill göra olika saker baserat på dem.
Något vagt som det oprövade, skrivet i fönstret:
} 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);
}
}
... där din app vet att återansluta om den ser en nollanslutning och sparar transaktionen den just försökte så att den kan försöka igen i en loop tills den lyckas om den hamnar i ett dödläge eller serialiseringsfel.
I verkligheten skulle du vara smartare än så här, lägga till hastighetsbegränsande för försök, etc. Detta är bara ett förenklat exempel.
För mer information, casta undantaget till PSQLException
efter att ha testat för castbarhet, eller fånga det som en PSQLException
för det första. Få sedan information med:
ex.getServerErrorMessage()
vilket ger dig en ServerErrorMessage
med detaljerade fält.