Tangkap SQLExceptoin
lalu gunakan SQLException.getSQLState()
dan bandingkan untuk melihat apakah itu yang Anda inginkan.
catch (SQLException ex) {
final String ss = ex.getSQLState();
//... blah blah ...
}
Lihat Kode kesalahan PostgreSQL untuk detail SQLState. (Meskipun sebagian besar kategori dan kode status adalah standar di seluruh DB, tidak semua DB mengimplementasikannya dengan cara yang sama dan membuangnya pada waktu yang sama, dan sebagian besar DB memiliki tambahan yang khusus untuk DB).
Tidak ada cara untuk menangkap pengecualian berdasarkan SQLState. Sayangnya, Anda harus menangkapnya, dan jika itu bukan yang Anda inginkan, bungkus dan lempar kembali. (Jangan hanya melempar kembali tanpa membungkus, Anda akan kehilangan tumpukan aslinya).
Di JDBC 4 ada subclass dari SQLException
seperti SQLNonTransientException
yang dapat Anda tangkap, tetapi hanya jika driver JDBC melempar subkelas tersebut. Pada saat penulisan, PgJDBC tidak mendukungnya, dan selalu melempar SQLException
, jadi jika Anda mencoba menangkapnya, Anda tidak akan pernah menangkap apa pun. (Tambalan dipersilakan!).
Di dunia nyata, Anda biasanya tertarik pada sejumlah kondisi kesalahan yang berbeda dan ingin melakukan hal yang berbeda berdasarkan kondisi tersebut.
Sesuatu yang samar-samar seperti yang belum teruji, tertulis di jendela:
} 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);
}
}
... di mana aplikasi Anda tahu untuk menyambung kembali jika melihat koneksi nol, dan menyimpan catatan transaksi yang baru saja dicoba sehingga dapat mencobanya kembali dalam satu lingkaran hingga berhasil jika menemui jalan buntu atau kegagalan serialisasi.
Pada kenyataannya Anda akan lebih pintar dari ini, menambahkan pembatasan kecepatan percobaan ulang, dll. Ini hanyalah contoh sederhana.
Untuk detail selengkapnya, berikan pengecualian ke PSQLException
setelah menguji kemampuan cast, atau tangkap sebagai PSQLException
di tempat pertama. Kemudian dapatkan detailnya dengan:
ex.getServerErrorMessage()
yang memberi Anda ServerErrorMessage
dengan bidang terperinci.