Kepala perusahaan saya mengatakan bahwa saya harus menulis semua, yaitu SEMUA kode saya dalam pernyataan Coba-tangkap. Sekarang, saya dapat memahami pendekatan 'lebih baik aman daripada menyesal' di sini, tetapi bukankah terlalu hati untuk berpikir bahwa akan ada pengecualian ketika Label dibuat, posisi form ditetapkan. adakah contoh di mana Pengecualian dalam operasi sederhana tersebut.
code-reviews
CyprUS
sumber
sumber
Jawaban:
Nah, ini sedikit berlebihan dan hanya menyebabkan kode berisik. Apa manfaat memiliki semua kode (misalnya masing-masing metode) ditulis dengan try catch handler? Ini hanya memberitahu Anda ada kesalahan yang harus diperbaiki di sebagian besar kasus. Seringkali, pengecualian dapat dan harus dihindari sejak awal.
Pandangan pada jejak tumpukan sebagian besar cukup untuk mengungkapkan penyebab dalam kode Anda, bahkan jika metode patahan tidak melakukan tangkapan itu sendiri. Ada kalanya pengembang merusak tumpukan-jejak dalam pengecualian, tetapi itu jauh lebih sering terjadi ketika Anda memiliki banyak dan banyak penangan pengecualian. Seperti apa pun: Sedikit itu baik, tetapi terlalu banyak racun.
Penanganan pengecualian memang cukup sederhana:
Tangkap Pengecualian
Jika Anda memikirkannya, maka selalu ada hanya satu tempat yang bagus untuk menangani pengecualian yang terjadi. Dan dengan demikian pawang harus berada di tempat itu.
Banyak pengecualian bahkan tidak boleh dilemparkan sejak awal, jadi jangan membangun struktur kontrol Anda di sekitar penanganan pengecualian, daripada mencoba untuk menghindari kemungkinan terjadinya pengecualian kapanpun dan dimanapun memungkinkan.
Ingatlah untuk menabrak lebih awal ketika segala sesuatu berjalan (tidak dapat diperbaiki) salah. Memasukkan semua kode dalam pernyataan coba-coba adalah tidak masuk akal, tetapi jangan lupa untuk melaporkan dan mencatat SEMUA pengecualian.
sumber
Pastinya ya! Selalu ada cara untuk melakukan kesalahan yang tidak Anda perkirakan. Dan "hati ayam" adalah ungkapan konyol untuk digunakan dalam konteks ini; pengembangan perangkat lunak bukan tentang membuktikan kejantanan Anda dengan mengabaikan masalah potensial.
Apa adalah pertanyaan yang valid adalah apakah itu berguna untuk pengecualian untuk ditangkap pada titik di mana standar coding Anda mengatakan mereka harus. Pernyataan Anda berbunyi seperti Anda harus mencoba / menangkap blok di setiap badan metode, dan itu memang tidak masuk akal karena Anda sering tidak dapat langsung melakukan sesuatu yang berguna dengan pengecualian, dan itu sebenarnya inti dari semua perkecualian: bahwa Anda dapat memilih untuk membiarkannya menyebarkan tumpukan panggilan untuk ditangani pada titik yang sesuai.
sumber
Saya akan membalikkan ini sebaliknya. Ya, sebagai aturan umum, penanganan pengecualian adalah hal yang baik, tetapi bisakah Anda benar-benar menangani setiap kemungkinan pengecualian dengan cara yang masuk akal pada titik di mana ia ditangkap? Kadang-kadang, terutama jika Anda tidak menulis perangkat lunak mission-critical, itu adalah lebih baik untuk hanya jatuh dan terbakar dalam beberapa cara setengah jalan-dikendalikan bila ada sesuatu yang tidak beres.
Jika Anda tidak dapat 100% yakin bahwa Anda dapat menangani setiap pengecualian tunggal yang mungkin ditangkap, Anda mungkin lebih baik menulis semacam pengendali pengecualian umum, membungkus loop utama program di dalamnya - mekanisme yang tepat bagaimana melakukannya dengan jelas tergantung pada bahasa tempat Anda bekerja. Di sana, catat sebanyak mungkin detail tentang pengecualian, simpan status program (di tempat lain selain dari penyimpanan data apa pun yang saat ini digunakan pengguna - ingat, semuanya mungkin rusak pada saat ini ), dan seterusnya. Kemudian, rethrow eksepsi dan biarkan OS menanganinya namun itu cocok. Dalam penangan pengecualian menangkap semua ini, bersiaplah untuk kegagalan katastropik. Kemudian, ketika program dimulai kembali, lihat apakah kondisi ini bermanfaat, dan pulihkan apa yang bisa diselamatkan jika itu; dan mungkin menawarkan pengguna untuk mengirim laporan bug kembali kepada Anda.
sumber
Secara keseluruhan, menggunakan try / catch yang banyak sudah usang, karena catch block sangat mahal dari sudut sumber daya. Coba / tangkap penggunaan mengingatkan saya pada manajemen risiko . Manajemen risiko memiliki dua dimensi:
Sekarang, jika Anda keluar dari rumah Anda, piano jatuh di kepala Anda di suatu tempat sementara sangat tidak mungkin terjadi (mungkin 0,001%), tetapi dapat membunuh Anda.
Penanganan pengecualian seperti itu. Coba blok tidak mahal. Tetapi catch block sangat mahal, karena perlu membuat tabel stack stack, dan melakukan hal-hal lain. Karena itu dalam membuat keputusan tentang coba / tangkap balok, Anda harus mempertimbangkan berapa kali Anda mungkin mengenai tangkap balok. Jika di antara 10.000 penggunaan, Anda hanya menekannya 1 kali, lalu gunakan. Tetapi jika itu adalah formulir, dan pengguna mungkin tidak mengisinya dengan benar 50% kali, maka Anda harus menghindari menempatkan blok coba / tangkap ke dalam tindakan di sana.
Di tempat-tempat di mana probabilitas terjadinya pengecualian tinggi, disarankan untuk menggunakan
if {} else {}
blok untuk menghindari terjadinya pengecualian. Misalnya, tempat Anda ingin membagi dua angka, alih-alih menulis:Anda harus menulis:
sumber
Anda harus menggunakan try-catch saat yang tepat, tapi tolong oh tolong jangan menangkap semua pengecualian dan bahkan tidak mencatatnya. Pada saat itu kode bau dan pekerjaan buruk.
sumber
Saya pribadi tidak tahan dengan pengecualian, mereka SANGAT, SANGAT, SANGAT sulit ditangani dengan benar. Dan berusaha untuk merusak data yang korup itu SANGAT, SANGAT, SANGAT sulit!
http://blogs.msdn.com/b/mgrier/archive/2004/02/18/75324.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2004/04/22/118161.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2005/01/14/352949.aspx
http://www.joelonsoftware.com/items/2003/10/13.html
Jika Anda tidak memanggil setiap fungsi seperti:
Tidak ada cara Anda akan membersihkan dengan benar di setiap titik keluar. Pengecualian adalah KERAS!
Satu-satunya hal yang baik tentang pengecualian adalah bahwa jika Anda tidak menangkapnya, aplikasi mogok karena perilaku yang tidak terduga.
sumber