Apakah ini antipattern? Itu praktik yang bisa diterima?
try {
//do something
} catch (Exception e) {
try {
//do something in the same line, but being less ambitious
} catch (Exception ex) {
try {
//Do the minimum acceptable
} catch (Exception e1) {
//More try catches?
}
}
}
anti-patterns
exception-handling
Tuan Smith
sumber
sumber
Jawaban:
Ini kadang-kadang tidak dapat dihindari, terutama jika kode pemulihan Anda mungkin mengeluarkan pengecualian.
Tidak cantik, tapi terkadang tidak ada alternatif.
sumber
Saya tidak berpikir itu adalah antipattern, hanya banyak disalahgunakan.
Kebanyakan mencoba menangkap bersarang memang dapat dihindari dan jelek kita, biasanya produk pengembang junior.
Tetapi ada saatnya Anda tidak bisa menahannya.
Selain itu, Anda akan memerlukan bool tambahan di suatu tempat untuk menandakan rollback yang gagal ...
sumber
Logikanya baik-baik saja - dalam beberapa situasi masuk akal untuk mencoba pendekatan fallback, yang dengan sendirinya dapat mengalami peristiwa luar biasa .... maka pola ini cukup banyak tidak dapat dihindari.
Namun saya akan menyarankan yang berikut ini untuk membuat kode lebih baik:
attemptFallbackMethod
DanattemptMinimalRecovery
.finally
blok mungkin lebih masuk akal - ini biasanya terjadi untuk apa pun yang terasa seperti "kode pembersihan sumber daya"sumber
Tidak masalah. Refactoring yang perlu dipertimbangkan adalah mendorong kode ke metode sendiri, dan menggunakan pintu keluar awal untuk sukses, membiarkan Anda menulis berbagai upaya untuk melakukan sesuatu di tingkat yang sama:
Setelah Anda pecah seperti itu, Anda bisa berpikir untuk membungkusnya dalam pola Strategi.
Kemudian gunakan saja
TrySeveralThingsStrategy
, yang merupakan semacam strategi gabungan (dua pola untuk harga satu!).Satu peringatan besar: jangan lakukan ini kecuali strategi Anda sendiri cukup kompleks, atau Anda ingin dapat menggunakannya dengan cara yang fleksibel. Kalau tidak, Anda akan membawa beberapa baris kode sederhana dengan tumpukan besar orientasi objek yang tidak perlu.
sumber
Saya tidak berpikir itu secara otomatis anti-pola, tetapi saya akan menghindarinya jika saya dapat menemukan cara yang lebih mudah dan lebih bersih untuk melakukan hal yang sama. Jika bahasa pemrograman yang Anda gunakan memiliki
finally
konstruksi, itu mungkin membantu membersihkannya, dalam beberapa kasus.sumber
Bukan anti-pola per se, tetapi pola kode yang memberi tahu Anda perlu melakukan refactor.
Dan itu sangat mudah, Anda hanya perlu tahu aturan praktis yang menulis tidak lebih dari blok percobaan dalam metode yang sama. Jika Anda tahu benar untuk menulis kode terkait bersama-sama, biasanya hanya menyalin dan menempel setiap blok coba dengan blok tangkap dan menempelkannya di dalam metode baru, lalu ganti blok asli dengan panggilan ke metode ini.
Aturan praktis ini didasarkan pada saran Robert C. Martin dari bukunya 'Kode Bersih':
Contoh singkat tentang "pseudo-java". Misalkan kita memiliki sesuatu seperti ini:
Lalu kita bisa refactor setiap try catch dan dalam hal ini setiap try-catch block mencoba hal yang sama tetapi di lokasi yang berbeda (betapa mudahnya: D), kita hanya perlu menyalin paste salah satu blok try-catch dan membuat metode untuk itu. .
Sekarang kami menggunakan ini dengan tujuan yang sama seperti sebelumnya.
Saya harap itu membantu :)
sumber
Ini tentu mengurangi pembacaan kode. Saya akan mengatakan, jika Anda memiliki kesempatan , maka hindari bersarang mencoba-menangkap.
Jika Anda harus mencoba tangkapan, selalu berhenti sebentar dan pikirkan:
apakah saya memiliki kesempatan untuk menggabungkannya?
haruskah saya cukup mengekstrak bagian bersarang ke dalam metode baru? Kode akan jauh lebih bersih.
Jelas jika Anda harus membuat tiga atau lebih level tangkapan percobaan, dalam satu metode, itu adalah tanda pasti waktu untuk refactor.
sumber
Saya telah melihat pola ini dalam kode jaringan, dan itu sebenarnya masuk akal. Inilah ide dasarnya, dalam kodesemu:
Pada dasarnya ini adalah heuristik. Satu upaya gagal untuk terhubung bisa saja merupakan kesalahan jaringan, tetapi jika itu terjadi dua kali, itu mungkin berarti mesin yang Anda coba sambungkan benar-benar tidak dapat dijangkau. Mungkin ada cara lain untuk menerapkan konsep ini, tetapi mereka kemungkinan besar akan lebih jelek daripada percobaan yang disarangkan.
sumber
Saya memecahkan situasi ini seperti ini (coba-coba dengan mundur):
sumber
Saya "harus" melakukan ini di kelas uji secara kebetulan (JUnit), di mana metode setUp () harus membuat objek dengan parameter konstruktor yang tidak valid dalam konstruktor yang melemparkan pengecualian.
Jika saya harus membuat konstruksi 3 objek tidak valid gagal, misalnya, saya perlu 3 blok try-catch, bersarang. Saya menciptakan metode baru sebagai gantinya, di mana pengecualian di mana tertangkap, dan nilai kembali adalah contoh baru dari kelas yang saya uji ketika berhasil.
Tentu saja, saya hanya perlu 1 metode karena saya melakukan 3 kali yang sama. Ini mungkin bukan solusi yang bagus untuk blok bersarang yang melakukan hal-hal yang sama sekali berbeda, tetapi setidaknya kode Anda akan menjadi lebih mudah dibaca dalam banyak kasus.
sumber
Saya benar-benar berpikir itu adalah antipattern.
Dalam beberapa kasus, Anda mungkin ingin mencoba beberapa tangkapan, tetapi hanya jika Anda TIDAK TAHU jenis kesalahan apa yang Anda cari, misalnya:
Jika Anda tidak tahu apa yang Anda cari, Anda HARUS menggunakan cara pertama, yaitu IMHO, jelek, dan tidak fungsional. Saya kira yang terakhir jauh lebih baik.
Jadi, jika Anda tahu jenis kesalahan apa yang Anda cari, lebih spesifik . Tidak perlu untuk bersarang atau mencoba-tangkap dalam metode yang sama.
sumber
Dalam beberapa kasus, Try-Catch yang bersarang tidak dapat dihindari. Misalnya ketika kode pemulihan kesalahan itu sendiri dapat melempar dan pengecualian. Tetapi untuk meningkatkan keterbacaan kode Anda selalu dapat mengekstrak blok bersarang ke dalam metode sendiri. Lihat posting blog ini untuk lebih banyak contoh di blok Try-Catch-Finally yang disarangkan.
sumber
Tidak ada yang disebutkan sebagai Anti Pattern di java di mana saja. Ya, kami menyebut beberapa hal praktik yang baik dan praktik yang buruk.
Jika blok coba / tangkap diperlukan di dalam blok tangkap yang diperlukan, Anda tidak dapat membantunya. Dan tidak ada alternatif. Sebagai blok penangkap tidak dapat berfungsi sebagai bagian mencoba jika pengecualian dilemparkan.
Sebagai contoh :
Di sini, dalam contoh di atas metode melempar pengecualian tetapi doMethod (digunakan untuk menangani metode pengecualian) bahkan melempar pengecualian. Dalam hal ini kita harus menggunakan try catch di dalam try catch.
beberapa hal yang disarankan untuk tidak dilakukan adalah ..
sumber