Terhadap pengecualian yang diperiksa
Selama bertahun-tahun, saya tidak mendapat jawapan yang memuaskan untuk soalan berikut: Mengapakah sesetengah pembangun sangat menentang untuk menyemak pengecualian? Saya mempunyai banyak perbualan, membaca catatan blog dan membaca pendapat Bruce Eckel (yang merupakan orang pertama yang bersuara menentang pengecualian yang diperiksa).
Saya sedang menulis beberapa kod baharu dan memberi banyak perhatian kepada cara pengecualian dikendalikan. Saya cuba memahami perspektif orang ramai "kami tidak suka pengecualian yang diperiksa", tetapi saya masih tidak dapat memahaminya.
Setiap perbualan yang pernah saya alami berakhir dengan soalan yang tidak dapat diselesaikan yang sama... Biar saya huraikan:
Secara umum (mengikut reka bentuk Java),
Hujah yang sering saya dengar ialah jika pengecualian berlaku, apa yang perlu dilakukan oleh pembangun ialah keluar dari program.
Satu lagi hujah biasa yang saya dengar ialah pengecualian yang disemak menjadikannya lebih sukar untuk memfaktorkan semula kod.
Untuk hujah "Saya akan berhenti", anda masih perlu memaparkan mesej ralat yang wajar walaupun anda berhenti. Jika anda hanya menangguhkan pengendalian ralat, pengguna anda tidak akan terlalu gembira apabila program keluar tanpa sebab yang jelas untuk keluar.
Bagi orang ramai yang "menyukarkan pemfaktoran semula", ini menunjukkan bahawa tahap abstraksi yang sesuai tidak dipilih. Daripada mengisytiharkan kaedah untuk membuang IOException, IOException harus ditukar menjadi pengecualian yang lebih sesuai untuk apa yang sedang berlaku.
Saya tidak tergila-gila membalut tangkapan Utama(Pengecualian) (atau dalam beberapa kes menangkap(Boleh Dibuang), yang memastikan program keluar dengan anggun, tetapi saya sentiasa menangkap yang khusus yang saya perlukan Pengecualian. Melakukan ini membolehkan saya sekurang-kurangnya memaparkan mesej ralat yang betul
Soalan yang tidak pernah dijawab orang ialah:
Jika anda membuang subkelas RuntimeException
dan bukannya subkelas Exception
, bagaimana anda tahu apa yang
patut ditangkap?
Jika jawapannya adalah untuk menangkap Exception, maka anda masih mengendalikan ralat pengaturcara dengan cara yang sama seperti pengecualian sistem. Itu nampak salah pada saya.
Jika anda menangkap Throwable, anda masih mengendalikan pengecualian sistem dan ralat VM (dan ralat serupa) dengan cara yang sama. Itu nampak salah pada saya.
Jika jawapannya ialah hanya menangkap pengecualian yang anda tahu dilemparkan, maka bagaimana anda tahu pengecualian yang dilemparkan? Apa yang berlaku apabila pengaturcara X melemparkan pengecualian baharu dan terlupa menangkapnya? Pada pendapat saya, ini berbahaya.
Saya akan mengatakan bahawa mesej yang akan menunjukkan surih tindanan adalah salah. Tidakkah orang yang tidak menyukai pengecualian yang disemak berpendapat demikian?
Jadi, jika anda tidak menyukai pengecualian yang disemak, bolehkah anda menjelaskan mengapa tidak, dan sila jawab soalan yang tidak dijawab.
Saya tidak mencari nasihat tentang masa untuk menggunakan mana-mana model, saya sedang mencari mengapa orang melanjutkan dari RuntimeException tetapi bukan dari Exception dan/ Atau sebab mengapa mereka melemparkan semula RuntimeException selepas menangkap pengecualian dan bukannya menambah lontaran pada kaedah. Saya ingin memahami motivasi orang ramai kerana tidak menyukai pengecualian yang disemak.
Atas ialah kandungan terperinci Mengapa Pembangun Menentang Pengecualian yang Diperiksa di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!