Sebenarnya saya sudah memikirkan itu cukup lama. Saya sendiri bukan penutur asli bahasa Inggris, tetapi saya masih memiliki pengalaman pemrograman bertahun-tahun dan saya selalu bertanya kepada saya. Mengapa disebut sebagai Pengecualian tetapi bukan Kesalahan karena itu kesalahan.
Bisa jadi PageNotFoundError
bukan PageNotFoundException
.
XYError
- misalnya, dengan Python.Jawaban:
Mereka tidak perlu menjadi kesalahan sama sekali. Fakta bahwa halaman tersebut tidak ada mungkin hanya fakta menarik daripada kesalahan yang sebenarnya. Mereka tampaknya terbiasa sebagai kesalahan hampir sepanjang waktu, saya akui. Tetapi kadang-kadang mereka digunakan untuk keluar dari loop, atau memberi tahu Anda bahwa string bukan nomor yang valid. Mereka dapat digunakan untuk menyimpan dan mengembalikan sejumlah besar data berguna - sebagai bagian dari pengembalian yang cukup normal. (Beberapa bahasa agak lambat dengan pengecualian mereka, dalam hal itu sering melempar itu adalah ide yang buruk.) Secara teori, pengecualian hanya berarti "jangan lakukan pengembalian normal, naikkan tumpukan panggilan sampai Anda menemukan seseorang yang tertarik di dalam."
Bahkan pengecualian null pointer mungkin tidak terlalu berarti bagi Anda. Anda memanggil kode orang lain, dan kemudian menangkap pengecualian null pointer karena Anda tahu itu cenderung meledak, mencetak pesan yang mengatakan kesalahan siapa itu, dan melanjutkan dan menyelesaikan pekerjaan Anda.
sumber
for (...) { if (func() == finished) { return finished; } else { itfailedsocheckanother(); }}
tetapi mengingat bahwa ada beberapa poin dalam kode di mana itu func () berulang, solusi pengecualian-semakin buruk setiap kali Anda menambahkan lebih banyak rekursi. Itulah yang saya sebut pemrograman kargo-kultus, pada dasarnya mensimulasikan pengecualian dalam bahasa yang sudah memilikinya karena pemimpin kultus mengatakan "Anda tidak akan menggunakan pengecualian".Mekanisme pengecualian tidak selalu digunakan untuk menandai kesalahan. Pengecualian dilempar keluar dari situasi biasa yang membutuhkan jalur kode terpisah untuk diproses, termasuk kesalahan. Misalnya, pengguna yang memberikan nama file yang tidak ada, atau memasukkan huruf alih-alih digit dalam bidang angka, adalah situasi luar biasa yang memerlukan penanganan khusus, tetapi ini bukan kesalahan.
Di beberapa lingkungan pemrograman, seperti Java,
Error
objek khusus disediakan untuk melaporkan "kesalahan sebenarnya", situasi yang tidak perlu ditangani oleh aplikasi yang masuk akal. Objek-objek ini dikirim menggunakan mekanisme yang sama yang digunakan untuk memberikan pengecualian, tetapi mereka memiliki makna khusus dari sinyal situasi yang tidak dapat dipulihkan.sumber
Saya tidak memiliki penelitian etimologis tentang asal-usul itu, tetapi saya dapat memahami bahwa menggunakan istilah "Kesalahan" mungkin tidak tepat dalam semua situasi; juga seperti disebutkan oleh hampirSharepointMaster, lebih baik memikirkan kesalahan dan pengecualian yang dilemparkan sebagai entitas yang terpisah.
Ketika Anda berada dalam bahasa pemrograman tingkat tinggi, masuk akal untuk mengasumsikan bahwa pengecualian selalu disebabkan oleh kesalahan, meskipun saya setuju juga dengan dasblinkenlight bahwa meskipun demikian pengecualian tidak selalu merupakan konsekuensi dari kesalahan. Saya, misalnya, menggunakan pengecualian untuk mengakhiri utas secara kolaboratif.
Pertama kali saya melihat istilah "pengecualian" ada di manual Majelis 80386. Saya ingat ketika saya melihatnya langsung terlihat alami bagi saya. Menyebut bahwa kesalahan tidak akan benar, karena tidak ada kesalahan dalam Majelis; hanya ada kondisi yang tidak dapat ditangani oleh prosesor (jika itu adalah kesalahan - dari programmer, pengguna atau sistem - well, prosesor sepenuhnya agnostik untuk itu). Saya tidak tahu apakah Intel benar-benar berasal dari istilah itu atau tidak, tapi mungkin ...
sumber
Pengecualian umum digunakan untuk memberi nama peristiwa yang tidak benar tetapi dapat dipulihkan dari, seperti
out_of_range
pengecualian dalam C ++, yang dilemparkan ketika mengakses elemen dalam vektor atau array yang tidak ada. Jelas peristiwa semacam itu tidak benar, tetapi hal itu terjadi tidak berarti seluruh program Anda mogok.Di sisi lain kesalahan biasanya digunakan untuk memberi nama sesuatu yang harus crash semuanya, sesuatu seperti stack overflow adalah contoh dari suatu peristiwa yang harus menghentikan program karena program tidak dapat menanganinya secara internal. Dengan kata lain: kesalahan adalah besar, sedangkan pengecualian relatif kecil.
sumber
Saya pikir ini lebih berkaitan dengan "evolusi" penanganan kesalahan. Dengan bahasa C / C ++ (sebelum penanganan pengecualian ditambahkan), jika suatu fungsi gagal, satu-satunya cara untuk mengetahuinya adalah melalui nilai pengembalian (misalnya
HRESULT
dalam win32). Jadi biasanya Anda akhirnya menangkap kode keluar dari setiap panggilan fungsi dan melakukan pemeriksaan. Pendekatan ini membuat kode lebih berantakan. Dan seringkali pengembang hanya akan menghindari menambahkan cek ini karena malas.Dengan diperkenalkannya penanganan pengecualian, pengembang sekarang memiliki dua opsi untuk meningkatkan kesalahan. Jadi kata "pengecualian" digunakan untuk membedakan kesalahan dari kesalahan "status keluar". Setelah periode waktu tertentu, penanganan pengecualian telah menjadi cara populer untuk menyebarkan kesalahan karena kode lebih mudah dibaca, dipelihara, dan mungkin ada satu tempat di mana Anda dapat memiliki logika penanganan kesalahan.
sumber
Dalam Python, mereka dinamakan sebagai ABCError Misalnya: KeyError, IndexError
http://docs.python.org/library/exceptions.html
Jadi saya pikir itu tergantung pada bahasa yang Anda gunakan.
sumber
Ketika kesalahan terjadi, sistem atau aplikasi yang sedang menjalankan melaporkannya dengan melemparkan pengecualian yang berisi informasi tentang kesalahan. Setelah dilempar, pengecualian ditangani oleh aplikasi atau oleh pengendali pengecualian default.
Kesalahan menunjukkan pengecualian yang merinci kesalahan, jadi tidak semuanya kesalahan yang merupakan pengecualian jika itu masuk akal;), misalnya pengecualian yang tidak disimpali, tidak boleh berupa kesalahan, tetapi melontarkan pengecualian.
http://msdn.microsoft.com/en-us/library/system.exception.aspx
sumber
Dalam pemrograman iOS / Mac, kami memiliki Pengecualian dan Kesalahan dalam satu bahasa.
Setidaknya dalam lingkungan itu pengecualian adalah "tidak dapat dipulihkan", sedangkan kesalahan adalah "dipulihkan".
Sebagai contoh:
Pengecualian biasanya merusak aplikasi Anda, sementara kesalahan biasanya kembali
nil
dan objek kesalahan (dikembalikan sebagai parameter dengan metode referensi). Anda dapat menangkap pengecualian dengan mencoba / menangkap / akhirnya memblokir tetapi disarankan untuk tidak menggunakan fitur bahasa ini - jika dimungkinkan untuk pulih dari pengecualian dengan cara apa pun, maka Anda tidak boleh melempar pengecualian sama sekali (Anda harus mengembalikan sebagai gantinya objek error).sumber
Sebuah kesalahan adalah sesuatu yang salah hilang dalam pelaksanaan program. Seringkali ini ditangani dengan mengajukan pengecualian , tetapi
Kesalahan adalah konsep semantik : diterapkan oleh programmer atau pengguna, yang datang ke program dengan harapan, untuk menggambarkan perbedaan antara harapan dan kenyataan mereka. Hanya seseorang yang dapat mengatakan apakah suatu rutinitas dalam keadaan kesalahan atau tidak.
Pengecualian adalah konsep sintaksis : itu adalah sesuatu dalam program itu sendiri, terlepas dari harapan siapa pun tentang apa yang seharusnya dilakukan oleh program itu. Sebuah rutinitas baik atau tidak menimbulkan pengecualian, terlepas dari apa yang orang pikirkan.
sumber
Pengecualian dan kesalahan berbeda.
Pengecualian adalah situasi yang dapat diatasi oleh suatu program, seperti misalnya Anda mencoba membuka file dan itu tidak ada, sementara kesalahan adalah situasi yang tidak dapat dilakukan oleh suatu program, seperti kerusakan disk atau kegagalan RAM.
sumber
Memunculkan dan menangani pengecualian adalah fitur aliran kontrol dan nama pengecualian harus mengikuti penggunaan yang diinginkan. Perancang kode dan API harus menemukan skema penamaan yang baik dan konsisten.
Jadi jawaban untuk pertanyaan Anda adalah: itu tergantung pada konteks dan perspektif.
sumber
Pengecualian berkembang sebagai generalisasi kesalahan. The bahasa pemrograman pertama yang mencakup mekanisme pengecualian adalah Lisp di awal 1970-an. Ada ringkasan yang baik dalam Pola Evolusi Bahasa oleh Gabriel dan Steele. Pengecualian (yang belum disebut pengecualian) muncul dari kebutuhan untuk menentukan perilaku suatu program jika terjadi kesalahan. Satu kemungkinan adalah menghentikan program, tetapi ini tidak selalu membantu. Implementasi Lisp secara tradisional memiliki cara untuk memasukkan debugger pada suatu kesalahan, tetapi kadang-kadang programmer ingin memasukkan penanganan kesalahan dalam program mereka. Jadi implementasi Lisp tahun 1960-an memiliki cara untuk mengatakan "lakukan ini, dan jika terjadi kesalahan maka lakukan itu sebagai gantinya". Awalnya kesalahan berasal dari fungsi primitif, tetapi programmer merasa nyaman untuk secara sengaja memicu kesalahan untuk melewatkan beberapa bagian dari program dan melompat ke penangan kesalahan.
Pada tahun 1972, bentuk modern penanganan pengecualian di Lisp muncul di MacLisp:
throw
andcatch
. The Software Pelestarian Grup daftar banyak materi pada implementasi Lisp awal, termasuk The MACLISP Referensi Revisi 0 oleh David Bulan . Primitifcatch
danthrow
didokumentasikan dalam §5.3 hal.43.Fokusnya adalah pada aliran kontrol nonlokal . Ini adalah bentuk goto (hanya goto ke atas), yang juga disebut melompat . Metafora adalah bahwa salah satu bagian dari program melempar nilai untuk kembali ke handler pengecualian, dan handler pengecualian menangkap nilai itu dan mengembalikannya.
Sebagian besar bahasa pemrograman saat ini mengemas tag dan nilai dalam objek pengecualian, dan menggabungkan mekanisme penangkapan dengan mekanisme penanganan.
Pengecualian tidak selalu berarti kesalahan. Mereka adalah cara untuk keluar dari blok kode dan dari blok di sekitarnya, melarikan diri sampai handler untuk pengecualian tercapai. Apakah hal seperti itu dianggap sebagai "kesalahan" dalam arti intuitif adalah subjektif.
Beberapa bahasa membedakan antara istilah "kesalahan" dan "pengecualian". Sebagai contoh, beberapa dialek Lisp memiliki keduanya
throw
untuk meningkatkan pengecualian (mengontrol aliran untuk pengguna, dimaksudkan untuk melakukan jalan keluar non-lokal dengan cara yang tidak menunjukkan bahwa ada sesuatu yang "salah") dansignal
untuk meningkatkan kesalahan (yang menunjukkan bahwa ada yang salah "dan dapat memicu acara debug).sumber
Anda akan menemukannya secara berbeda ditafsirkan dalam implementasi bahasa pemrograman yang berbeda. Seperti yang dikatakan dasblinkenlight, itu adalah cara pandang java untuk melakukan demarkasi antara Kesalahan dan Pengecualian. Dalam banyak bahasa pemrograman, pengecualian adalah pelanggaran yang dapat ditangani atau dibiarkan digelembungkan untuk diteruskan ke modul kode setinggi mungkin. Kesalahan umumnya adalah situasi di mana wadah runtime bahasa Anda menangani (dan banyak kasus hanya menghentikan eksekusi).
sumber
Kesalahan selalu merupakan kesalahan. Pengecualian adalah kesalahan dalam konteks saat ini. Artinya, pengecualian adalah konteks sensitif. Contoh pengecualian adalah menambahkan ascii "a" ke integer "1". Kesalahan mungkin sesuatu seperti menggunakan operator yang tidak ditentukan seperti "+!" dalam kebanyakan bahasa.
Beberapa lesung akan memungkinkan Anda untuk Tentukan jalan keluar dari situasi jika itu yang benar-benar ingin Anda lakukan.
sumber