Saya telah mendengar bahwa pernyataan try-catch bersarang sering kali merupakan bau kode, jadi saya bertanya-tanya apakah situasi ini merupakan pengecualian. Jika tidak, apa cara yang baik untuk refactor?
Kode saya terlihat seperti berikut:
try{
X x = blah;
otherStuff;
for (int i = 0; i < N; i++){
try{
String y = Integer.toString(i);
f(x);
}
catch(Exceptions1 e1){
System.err.println(... + y + ...);
System.exit(0);
}
}
catch(Exceptions2 e2){
...
}
Saya menggunakan di Exceptions
sini untuk menunjukkan tangkapan multi.
e2
digunakan untuk menangkap pengecualian yang dilontarkan dengan menginisialisasi x
dan melakukan otherStuff
. Idealnya, saya hanya akan memiliki surround try-catch saya hanya dua baris, tetapi saya menggunakan x
dalam loop saya dan ingin menghindari peringatan "tugas yang tidak terpakai" yang disebabkan oleh inisialisasi ke nol di luar try-catch.
e1
tidak multi-tertangkap dengan e2
karena saya ingin memberikan pengguna dengan informasi tentang detail iterasi dan dengan demikian ingin menangkap blok di dalam loop.
sumber
Kecuali jika Anda bermaksud untuk memproses seluruh loop batin apakah pengecualian terjadi atau tidak, kode Anda pada dasarnya setara dengan
yang tidak perlu bersarang.
Jika Anda masih membutuhkan penanganan pengecualian dalam, refactor pengecualian dalam dan metode penutupnya menjadi metode baru. Ini juga memiliki manfaat tambahan memaksa Anda berpikir tentang cara lain untuk memproses loop batin; pengecualian bisa menjadi sangat mahal dalam hal kinerja, jika banyak dari mereka terlempar.
sumber
Saya memiliki beberapa pengamatan pada pertanyaan Anda:
Dalam contoh yang Anda berikan, Anda tidak perlu pengecualian sama sekali. Anda hanya perlu memeriksa string y, mencatat kesalahan apa pun, dan keluar dari loop. Tidak ada yang luar biasa tentang Anda yang tidak valid dan perlu dicatat. Fakta Anda menggunakan pengecualian dalam hal ini adalah indikasi bau kode.
Pengecualian multi-tangkapan tidak benar-benar dimaksudkan untuk digunakan untuk membungkus petak besar kode dan menangkap apa pun yang mungkin salah. Mereka dimaksudkan untuk membantu membedakan antara pengecualian dalam kasus di mana satu bagian kode dapat menghasilkan serangkaian pengecualian yang berbeda. Karena Anda menggunakan pengecualian mutli-catch sebagai semacam pendekatan "tangkap semua", ini mengindikasikan adanya bau kode.
Tidak masuk akal untuk mencoba menangkap dalam loop kecuali jika Anda berencana untuk melanjutkan beralih melalui sisa loop bahkan jika pengecualian ditemukan pada salah satu elemen. Kode sampel Anda menunjukkan Anda berencana untuk keluar dari loop jika ada satu item yang luar biasa.
Saya pikir Anda mungkin lebih baik dengan sesuatu seperti:
Ini jauh lebih jelas, tetapi masih menderita masalah yang dijelaskan di atas.
sumber