Rumah > Java > javaTutorial > Mengapa Pembangun Menentang Pengecualian yang Diperiksa di Java?

Mengapa Pembangun Menentang Pengecualian yang Diperiksa di Java?

Susan Sarandon
Lepaskan: 2024-12-05 09:51:12
asal
699 orang telah melayarinya

Why Do Developers Oppose Checked Exceptions in Java?

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),

  • Ralat adalah untuk perkara yang tidak sepatutnya ditangkap (VM Alah kepada kacang tanah, seseorang secara tidak sengaja menaburkan setin kacang ke atasnya)
  • Pengecualian masa jalan adalah untuk perkara yang salah pengaturcara (pengaturcara keluar dari had menggunakan tatasusunan)
  • Pengecualian (berjalan Kecuali untuk pengecualian) Ya Digunakan untuk perkara di luar kawalan pengaturcara (cakera penuh semasa menulis fail dalam sistem fail, had proses pada bilangan pemegang fail telah dicapai, fail tidak boleh dibuka lagi)
  • Boleh dibuang objek hanyalah induk kepada semua jenis jenis pengecualian.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan