Di C #, saya bisa menggunakan throw;
pernyataan untuk rethrow pengecualian sambil menjaga jejak stack:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Apakah ada sesuatu seperti ini di Jawa ( yang tidak kehilangan jejak tumpukan asli )?
Throwable
s jangan dimodifikasi dengan melempar mereka. Untuk memperbarui jejak tumpukan, Anda harus meneleponfillInStackTrace()
. Mudah metode ini dipanggil dalam konstruktor aThrowable
.throw e;
akan kehilangan stacktrace. Tetapi tidak di Jawa.Jawaban:
hanya akan mengubah kembali pengecualian yang Anda tangkap (jelas metode di sekitarnya harus mengizinkan ini melalui tanda tangannya dll.). Pengecualian akan mempertahankan jejak tumpukan asli.
sumber
catch(Exception e) { throw e; }
yang akan ditangani. Jika Andacatch(InterruptedException ie) { throw ie; }
akan ditangani. Sebagai aturan praktis, jangancatch(Exception e)
- ini bukan pokemon, dan kami tidak ingin menangkap mereka semua!Saya akan lebih memilih:
sumber
Exception
biasanya bukan hal yang tepat untuk dilakukan, dalam sebagian besar (tetapi tidak semua) kasus.Anda juga dapat membungkus pengecualian di yang lain DAN menyimpan jejak tumpukan asli dengan meneruskan Pengecualian sebagai Throwable sebagai parameter penyebab:
sumber
throw new YourOwnException("Error while trying to ....", e);
Di Jawa hampir sama:
sumber
Di Jawa, Anda hanya melempar pengecualian yang Anda tangkap, jadi
throw e
bukan hanyathrow
. Java memelihara jejak stack.sumber
sesuatu seperti ini
sumber
Ini adalah contoh konkret di mana metode melempar
IOException
. Thefinal
berartit
hanya bisa menampung pengecualian dilempar dari blok try. Bahan bacaan tambahan dapat ditemukan di sini dan di sini .sumber
Jejak tumpukan di-prserved jika Anda membungkus pengecualian yang ditangkap ke dalam pengecualian lain (untuk memberikan lebih banyak informasi) atau jika Anda hanya memikirkan kembali pengecualian yang ditangkap.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
sumber
Saya baru saja mengalami situasi yang sama di mana kode saya berpotensi melempar sejumlah pengecualian berbeda yang hanya ingin saya pikirkan kembali. Solusi yang dijelaskan di atas tidak bekerja untuk saya, karena Eclipse mengatakan kepada saya bahwa
throw e;
mengarah ke pengecualian yang tidak ditangani, jadi saya hanya melakukan ini:Bekerja untuk saya .... :)
sumber