Akhiran Pengecualian pada pengecualian di java

19

Menentukan akhiran Pengecualian pada kelas pengecualian terasa seperti kode bau bagi saya (informasi Redundan - sisa nama menyiratkan keadaan kesalahan dan mewarisi dari Pengecualian). Namun, tampaknya juga semua orang melakukannya dan ini merupakan praktik yang baik.

Saya ingin memahami mengapa ini adalah praktik yang baik.

Saya sudah melihat dan membaca pertanyaan mengapa pengecualian biasanya memiliki pengecualian akhiran dalam nama kelas

Pertanyaannya adalah untuk PHP dan sementara tanggapannya mungkin berlaku untuk Java. Apakah ada argumen lain atau apakah itu benar-benar sesederhana membedakannya secara eksplisit?

Jika kita mengambil contoh dari pertanyaan sebelumnya - mungkinkah ada benar-benar kelas di java dengan nama FileNoFoundyang tidak terkecuali? Jika ada, apakah itu suffix dengan itu Exception?

Melihat hirarki cepat dalam gerhana Exception, tentu saja, sebagian besar dari mereka memang memiliki akhiran pengecualian, tetapi ada beberapa pengecualian. javassistadalah contoh perpustakaan yang tampaknya memiliki beberapa pengecualian tanpa akhiran - misalnya BadByteCode, BadHttpRequestdll.

BouncyCastle adalah lib lain dengan pengecualian seperti CompileError

Saya sudah sedikit mencari di Google dengan sedikit info tentang subjek.

drone.ah
sumber
2
"Haruskah semua pengecualian mengandung Exceptionsufiks, atau haruskah kita membuat pengecualian untuk pengecualian luar biasa?" ;)
tdammers
2
sebenarnya Error adalah seperti Exception (lihat OutOfMemoryError) tetapi mereka dimaksudkan untuk hal-hal yang sulit untuk dipulihkan (sehingga Anda hampir tidak pernah berurusan dengan mereka)
ratchet freak
1
Juga, saya pernah mendengar bahwa sebagai aturan umum 'kelas harus kata benda dan metode harus kata kerja (tindakan)'. FileNotFound ArrayIndexOutOfBoundsdan OutOfMemorylebih banyak pengamatan / deskripsi, tetapi kemudian diterapkan pada kata benda Exception.
MikeTheLiar

Jawaban:

27

Jawaban Landei adalah jawaban yang bagus, tetapi ada juga jawaban gramatikal. Nama kelas harus berupa kata benda . Apa itu "OutOfMemory"? Apa itu "FileNotFound"? Jika Anda menganggap "Pengecualian" sebagai kata benda, maka deskriptor adalah kata sifat yang menentukannya. Bukan sembarang Exception, itu a FileNotFoundException. Anda tidak perlu menangkap OutOfMemorylebih daripada pergi ke toko untuk membeli "biru".

Ini juga muncul jika Anda membaca kode Anda sebagai kalimat: " Trymelakukan ..., dan catch OutOfMemory Exceptions"

Bobson
sumber
1
Mengutip artikel "Cobalah untuk menggunakan kata benda karena suatu kelas biasanya mewakili sesuatu di dunia nyata". Tetapi apakah pengecualian termasuk dalam kasus ini? Bagi saya, mereka lebih seperti artefak pemrograman, mewakili pesan kesalahan. "Anda akan mendapatkan OutOfMemorypengecualian" berbunyi lebih baik dari "Anda akan mendapatkan OutOfMemoryExceptionpengecualian", bukan?
greg0ire
1
@ greg0ire - Anda harus mencobanya sebagai "Anda akan mendapat OutOfMemoryException." Yang mengatakan, kami juga memiliki nomor PIN dan mesin ATM, sehingga pengecualian OOME tidak akan yang tidak biasa.
Bobson
Saya pikir poin yang Anda buat di sini benar-benar yang terbaik (yang tentang konflik nama tidak berlaku lagi berkat namespace, setidaknya dalam php). Saya memiliki banyak hal untuk dikatakan tentang semua ini, dan akan segera mengirimkan jawaban.
greg0ire
Selesai! Bagaimana menurut anda?
greg0ire
@ Bobson Saya sarankan membaca The Kingdom of Nouns . Kita tidak perlu semuanya menjadi kata benda. Mengapa "Anda akan mendapatkan OutOfMemoryException" saat itu hanya bisa "Anda adalah out of memory"? Kami tidak menggunakan Classakhiran ( DogClass, CatClass, XmlReaderClass, ...).
Matthieu Napoli
6

Saya pikir pengecualian (dan kesalahan, dan secara teoritis lainnya Throwable) berbeda dari hal-hal seperti antarmuka atau enum (yang biasanya tidak digunakan sebagai akhiran): Mereka biasanya memiliki tujuan yang sangat jelas dan terbatas, mereka digunakan dengan konstruksi bahasa khusus ( try, catch, throw, throws) dan mengikuti aturan khusus (misalnya diperiksa vs pengecualian dicentang, tidak ada obat generik). Di satu sisi mereka bukan hanya kelas yang kebetulan digunakan sebagai pengecualian, tetapi mekanisme pengecualian yang diterapkan dengan cara kelas.

Jadi jika Anda berurusan dengan pengecualian dan tidak mengenalinya, biasanya ada sesuatu yang sangat salah (yang lagi-lagi tidak berlaku untuk hal-hal seperti enum atau antarmuka). Jadi saya pikir perbedaan ini untuk kelas "normal" cukup besar untuk meminta petunjuk visual.

Landei
sumber
1
Kedengarannya bertentangan dengan diriku sendiri. Jika pengecualian itu khusus dan digunakan dalam cara-cara khusus sehingga jelas dikenali, mengapa Anda memerlukan petunjuk visual?
Michael Borgwardt
@MichaelBorgwardt - Saya pikir dia mengatakan itu karena mereka spesial dan digunakan dengan cara khusus, mereka harus memiliki petunjuk visual agar jelas dikenali. Yang sedang berkata, saya tidak tahu apakah Anda bahkan bisa melempar sesuatu yang tidak diwarisi dari Exceptiondi Jawa - Anda tidak bisa dalam C #. Jika Anda tidak bisa, maka saya tidak bisa memikirkan skenario di mana Anda akan "berurusan dengan pengecualian dan [tidak] mengenalinya seperti itu".
Bobson
Anda juga tidak bisa melempar non- Throwables di Java. Namun Anda dapat menangani pengecualian tidak hanya dalam try- catchpengaturan, misalnya Anda dapat mengumpulkan pengecualian ketika Anda membuat semacam validasi untuk objek yang kompleks (ketika Anda ingin mengetahui semua masalah terkait, bukan hanya yang pertama). Dalam kasus seperti itu Anda harus menyadari bahwa Anda dapat misalnya re membuang-hal yang Anda miliki dalam daftar Anda, sehingga akan buruk untuk memanggil mereka yaitu ValidationIssuebukan ValidationException.
Landei
0

Namun, tampaknya juga semua orang melakukannya dan ini merupakan praktik yang baik.

Ya, semua orang memang melakukannya, jadi ini praktik, tetapi apakah masih bagus? Beberapa orang mempertanyakan itu:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (Konteks Exception §: php)
  • video yang ditautkan, https://vimeo.com/album/2661665/video/74316116 (lompat ke 53:00, konteks: php), menginspirasi artikel dan menyatakan bahwa setiap kali Anda menggunakan pengecualian, Anda memiliki kata kunci yang sudah menunjukkan itu adalah pengecualian di dekatnya
  • http://verraes.net/2013/10/verbs-in-class-names/ menunjukkan bagaimana pernyataan dalam jawaban @ Bobson mungkin tidak mutlak, dan menekankan bahwa terkadang sufiks baik, untuk aplikasi atau pengecualian tingkat infrastruktur, dan kadang-kadang Anda harus mencoba menyimpan karakter yang diambil oleh akhiran panjang ini untuk mengekspresikan sesuatu yang lebih tepat dan bermakna. Poin ini hanya masuk akal jika Anda menggunakan bahasa tempat budaya tersebut menggunakan pengecualian untuk pelanggaran aturan bisnis.
  • yang SO tautan yang Anda berikan merek poin tentang konflik nama, tapi sekarang, kita memiliki ruang nama, bukan?
greg0ire
sumber
Ini adalah pertanyaan java , bukan php . Idiom berbeda antar bahasa. Yang mengatakan, saya sangat tidak setuju dengan kutipan ini dari tautan ketiga Anda: "Pengecualian dapat mirip dengan peristiwa, ... dengan nuansa bahwa itu adalah peristiwa yang tidak diinginkan, peringatan bahwa beberapa operasi tidak konsisten dengan, misalnya, aturan bisnis yang berlaku. " Mungkin PHP berbeda tentang ini, tetapi menurut saya, pengecualian seharusnya luar biasa. Jika aturan bisnis dilanggar dengan cara apa pun yang diharapkan, logika normal Anda harus menanganinya - itu bukan pengecualian untuk perilaku normal.
Bobson
Anda mungkin benar bahwa ini bervariasi berdasarkan bahasa per bahasa: lihat utas ini tentang python: gossamer-threads.com/lists/python/python/796627 . php dan python jelas tidak berfokus pada kinerja, itu mungkin mengapa ada perbedaan ini dengan java (yang berfokus pada kinerja, kan?). Jika Anda memiliki beberapa lapisan untuk menyeberang di tumpukan panggilan Anda sebelum berada di tingkat yang tepat untuk menangani pelanggaran aturan bisnis dengan benar, pengecualian adalah IMO terbaik. Ini juga membuat tipe pengembalian lebih konsisten (Anda selalu mengembalikan jenis yang sama, bukan false atau true). Saya akan mengedit jawaban saya ini ke akun
greg0ire