Ini adalah T terkait: Apakah penggunaan klausa akhirnya untuk melakukan pekerjaan setelah kembali gaya buruk / berbahaya?
Dalam Q yang direferensikan, kode akhirnya terkait dengan struktur yang digunakan dan perlunya pre-fetching. Pertanyaan saya sedikit berbeda, dan saya yakin itu cocok untuk audiens yang lebih luas. Contoh khusus saya adalah aplikasi C # winform, tetapi ini akan berlaku untuk C ++ / Java akhirnya digunakan juga.
Saya memperhatikan beberapa blok coba-tangkap-akhirnya di mana ada banyak kode yang tidak terkait dengan pengecualian dan penanganan / pembersihan terkubur di dalam blok. Dan saya akan mengakui bias saya terhadap memiliki blok try-catch-akhirnya yang sangat ketat dengan kode yang terkait erat dengan pengecualian dan penanganannya. Berikut adalah beberapa contoh dari apa yang saya lihat.
Blok Try akan memiliki banyak panggilan awal dan variabel yang diatur mengarah ke kode yang bisa melempar. Informasi pencatatan akan mendapatkan pengaturan dan berjalan di blok coba juga.
Akhirnya blok akan memiliki panggilan form / modul / control form (meskipun aplikasi akan segera berakhir, seperti yang dinyatakan dalam catch block), serta membuat objek baru seperti panel.
Kurang lebih:
methodName (...) { mencoba { // Banyak kode untuk metode ini ... // kode yang bisa melempar ... // Banyak lagi kode untuk metode dan pengembalian ... } menangkap (sesuatu) {// menangani pengecualian} akhirnya { // beberapa pembersihan karena pengecualian, menutup beberapa hal // lebih banyak kode untuk hal-hal yang telah dibuat (mengabaikan segala pengecualian yang bisa dilemparkan) ... // mungkin membuat beberapa objek lagi } }
Kode berfungsi, jadi ada beberapa nilai untuk itu. Tidak dienkapsulasi dengan baik dan logikanya agak berbelit-belit. Saya (dengan susah payah) akrab dengan risiko dalam mengubah kode di sekitar serta refactoring, jadi pertanyaan saya bermuara pada keinginan untuk mengetahui pengalaman orang lain dengan kode yang terstruktur serupa.
Apakah gaya buruk membenarkan membuat perubahan? Adakah yang terbakar parah dari situasi yang sama? Maukah Anda berbagi rincian pengalaman buruk itu? Biarkan itu karena saya bereaksi berlebihan dan itu tidak seburuk gaya? Dapatkan manfaat perawatan untuk membereskan semuanya?
finally
ada di C #). Apa yang setara dengan C ++? Apa yang saya pikirkan adalah kode setelah catch
, dan itu berlaku sama untuk kode setelah C # finally
.
Environment.FailFast()
; itu tidak dapat dieksekusi jika Anda memiliki pengecualian yang tidak tertangkap. Dan itu menjadi lebih rumit jika Anda memiliki blok iterator dengan finally
yang Anda iterate secara manual.
finally
. Semua kegunaan baik tercakup dalam RAII / RRID / SBRM (mana pun yang Anda suka).