Pertanyaan Perbedaan antara getCause dan getNextException di SQLException?


Melihat ke Javadocs SQLException, sepertinya ada tumpang tindih antara getCause dan getNextException. Yang pertama mengembalikan Throwable, tetapi sebaliknya mereka tampaknya cukup banyak dipertukarkan.

Apa perbedaan antara keduanya? Ketika mengembangkan driver JDBC, apakah ada pedoman tentang kapan harus memilih salah satu dari yang lain sebagai mekanisme chaining pengecualian?


11
2018-06-29 08:06


asal


Jawaban:


Metode getCause() memberi Anda penyebab - jika ada - spesifik itu SQLException. Di sisi lain selama pemrosesan sangat mungkin bahwa beberapa pengecualian terjadi, pikirkan pemrosesan batch, kesalahan serveride untuk beberapa parameter permintaan (misalnya terlalu panjang, kesalahan konversi dll).

Pengecualian ganda ini berada pada level yang sama (keduanya tidak saling menyebabkan), sehingga mereka ditambahkan ke rantai SQLExceptions. Kepala rantai ini adalah pengecualian yang dilemparkan. Untuk sampai ke yang lain SQLExceptiondi dalam rantai, Anda gunakan getNextException(). Misalnya

try {
   // Something that produces multiple SQLExceptions
} catch (SQLException e) {
   SQLException current = e;
   do {
      // do something with current
   } while ((current = current.getNextException()) != null)
}

Di sisi lain, a SQLException juga memiliki metode public Iterator<Throwable> iterator() (diperkenalkan di Java 6 / JDBC4), ini mengulangi masing-masing SQLException dan penyebab mereka sebelum melanjutkan ke yang berikutnya SQLException dalam rantai.


12
2018-06-29 08:17



Operasi SQL bisa gagal karena beberapa alasan independen - misalnya, Anda bisa mencoba memperbarui beberapa baris, dan tiga baris tidak ada. Ketiga kegagalan itu bersifat independen - tidak satu pun dari mereka yang menyebabkan yang lainnya. Di situlah getNextException() sesuai - dan Anda dapat menggunakannya setNextException() saat membangun pengecualian.

Di sisi lain, jika seluruh operasi gagal karena disana ada IOException ketika berbicara ke database, itu adalah akar penyebab - satu-satunya alasan SQLException terjadi adalah karena IOException terjadi. Di situlah getCause() sesuai - lulus dalam penyebab ke konstruktor ketika Anda membuat SQLException.


5
2018-06-29 08:11



Eksekusi pernyataan SQL dapat menghasilkan banyak SQLExceptions, khususnya jika itu adalah pernyataan batch. Misalkan Anda memasukkan 10 baris dalam satu batch dan dua gagal: Anda akan mendapatkan satu pengecualian yang memberi tahu Anda batch gagal dan bahwa Anda harus menggunakan metode getNextException untuk mengakses rincian. Ini mungkin tergantung pada driver database sekalipun.

Penyebab pengecualian digunakan saat membungkus satu pengecualian di pengecualian lain, misalnya membuang pengecualian khusus aplikasi yang disebabkan oleh IO atau SQLException.


5
2018-06-29 08:13