Mengapa kesalahan dinamai "Pengecualian" tetapi tidak sebagai "Kesalahan" dalam bahasa pemrograman?

45

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 PageNotFoundErrorbukan PageNotFoundException.

Tarik
sumber
41
Tidak semua situasi luar biasa adalah kesalahan.
Andrew T Finnell
15
Itu perbedaan antara membelok mobil dan menabrak mobil.
Insinyur Dunia
6
Apakah Anda hanya berbicara tentang penamaan kelas pengecualian tertentu? Kemudian diketahui bahwa dalam beberapa ekosistem, mereka yang disebut XYError- misalnya, dengan Python.
6
Pikiran Anda, Java memang memiliki kelas Kesalahan, yang mewarisi dari Throwable. Lihat docs.oracle.com/javase/1.4.2/docs/api/java/lang/Error.html untuk detail lebih lanjut. Anda mungkin juga ingin memeriksa kategori "Subclass Langsung Dikenal".
luiscubal
Saya ingin mengatakan bahwa teka-teki ini tidak ada hubungannya dengan bahasa Inggris. Ini lebih merupakan kategorisasi logis di mana bahasa lisan yang Anda pilih mahir.
שינתיא אבישגנת

Jawaban:

59

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.

RalphChapin
sumber
27
Meskipun penggunaan mekanisme pengecualian sebagai aliran kontrol dapat membingungkan dan saya pikir umumnya disukai.
ChaosPandion
11
@ChaosPandion: Tergantung pada bahasa / budaya.
amara
11
@DocBrown: Saya pernah menulis solver sudoku yang melakukan pencarian rekursif backtracks ketika gagal menemukan solusi dalam upaya saat ini dan coba lagi dengan nilai yang berbeda; dan ketika suatu solusi ditemukan, ia melempar pengecualian yang mengandung solusi. Masalah di sini kegagalan adalah situasi "normal", dan kesuksesan adalah situasi "luar biasa"; dan karena ada beberapa titik dalam pemecah di mana ia memanggil dirinya sendiri, tanpa menggunakan pengecualian Anda harus menulis banyak pelat untuk memeriksa apakah panggilan kembali dari pencarian yang berhasil atau dari pencarian yang gagal.
Lie Ryan
5
@ Falcon: ya Anda hanya bisa mengembalikan nilai 'selesai', itu berarti setiap kali Anda kambuh, Anda harus melakukannya: 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".
Lie Ryan
8
@ Falcon: Ah ... stok "sepertinya Goto" argumen, argumen yang berfungsi untuk mengatakan Anda tidak boleh menggunakan loop atau jika pernyataan atau fungsi memanggil, karena "mereka semua terlihat seperti goto". Mengembalikan sukses dengan pengecualian hanya WTF jika Anda mengaitkan pengecualian dengan kesalahan. Bagi saya, ketika digunakan dengan cara ini, blok try-catch seperti "janji untuk kembali ke sini setelah perjalanan panjang", perilaku coba-kecuali + melempar sangat mirip dengan fungsi-panggilan + pengembalian kecuali untuk perjalanan yang jauh lebih lama yang mungkin melibatkan tumpukan panggilan yang sangat dalam ketika Anda selesai mencari solusi.
Lie Ryan
21

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, Errorobjek 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.

dasblinkenlight
sumber
6

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 ...

Fabio Ceconello
sumber
3

Pengecualian umum digunakan untuk memberi nama peristiwa yang tidak benar tetapi dapat dipulihkan dari, seperti out_of_rangepengecualian 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.

jozefg
sumber
3

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 HRESULTdalam 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.

Ankush
sumber
2

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.

HVNMencintai
sumber
4
Jangan lupa VB (klasik, bukan. Net). Pada Kesalahan, Goto digunakan. Dan penemuan paling menakjubkan sepanjang masa "On Error Resume Next"
Kibbee
1
Dalam Python, kesalahan adalah bagian dari pengecualian. Ada empat pengecualian standar yang mewarisi dari Pengecualian tetapi tidak mewarisi dari StandardError: StopIteration, GeneratorExit, KeyboardInterrupt dan SystemExit.
Dirk Holsopple
1

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

Ali Jafer
sumber
0

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:

  • jika Anda memiliki array dengan 10 item, dan Anda mencoba mengakses item di indeks 30 - itu akan menjadi pengecualian. Anda membuat kesalahan dalam pemrograman Anda.
  • jika Anda mencoba mengunduh URL tetapi tidak ada koneksi internet, itu yang diharapkan dan Anda harus menyampaikan beberapa jenis pesan kepada pengguna.

Pengecualian biasanya merusak aplikasi Anda, sementara kesalahan biasanya kembali nildan 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).

Abhi Beckert
sumber
2
Yah, itu sama sekali berbeda dari apa yang dimaksud Pengecualian dan Kesalahan bagi pengembang lain!
Tarik
Setiap bahasa berbeda kurasa. Objective-C / Cocoa adalah salah satu bahasa tertua yang digunakan secara aktif (dari sekitar tahun 1983), jadi mungkin agak kuno. Namun, jika definisi berubah dari satu komunitas ke komunitas lainnya, penting untuk mengetahui hal itu.
Abhi Beckert
0

Sebuah kesalahan adalah sesuatu yang salah hilang dalam pelaksanaan program. Seringkali ini ditangani dengan mengajukan pengecualian , tetapi

  • tidak ada yang memaksa seorang programmer untuk menangani kesalahan dengan menaikkan pengecualian, dan
  • tidak ada yang memaksa seorang programmer untuk menaikkan pengecualian hanya jika ada kesalahan.

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
0

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.

Tulains Córdova
sumber
0

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.

mmehl
sumber
0

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: throwand catch. The Software Pelestarian Grup daftar banyak materi pada implementasi Lisp awal, termasuk The MACLISP Referensi Revisi 0 oleh David Bulan . Primitif catchdan throwdidokumentasikan dalam §5.3 hal.43.

catchadalah fungsi LISP untuk melakukan keluar non-lokal terstruktur. (catch x)mengevaluasi xdan mengembalikan nilainya, kecuali jika selama evaluasi x (throw y)harus dievaluasi, catchsegera kembali ytanpa evaluasi lebih lanjut x.

catchjuga dapat digunakan dengan argumen econd, tidak dievaluasi, yang digunakan sebagai tag untuk membedakan antara tangkapan bersarang. (...)

throwdigunakan dengan catchsebagai mekanisme keluar nonlokal terstruktur.

(throw x)mengevaluasi xdan melempar nilai kembali ke yang terbaru catch.

(throw x <tag>)melempar nilai xkembali ke catchlabel terbaru dengan <tag>atau tidak label.

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 throwuntuk meningkatkan pengecualian (mengontrol aliran untuk pengguna, dimaksudkan untuk melakukan jalan keluar non-lokal dengan cara yang tidak menunjukkan bahwa ada sesuatu yang "salah") dan signaluntuk meningkatkan kesalahan (yang menunjukkan bahwa ada yang salah "dan dapat memicu acara debug).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
-1

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

shibathethinker
sumber
-1

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.

W8CCW
sumber