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
and catch
. The Software Pelestarian Grup daftar banyak materi pada implementasi Lisp awal, termasuk The MACLISP Referensi Revisi 0 oleh David Bulan . Primitif catch
dan throw
didokumentasikan dalam §5.3 hal.43.
catch
adalah fungsi LISP untuk melakukan keluar non-lokal terstruktur. (catch x)
mengevaluasi x
dan mengembalikan nilainya, kecuali jika selama evaluasi x
(throw y)
harus dievaluasi, catch
segera kembali y
tanpa evaluasi lebih lanjut x
.
catch
juga dapat digunakan dengan argumen econd, tidak dievaluasi, yang digunakan sebagai tag untuk membedakan antara tangkapan bersarang. (...)
throw
digunakan dengan catch
sebagai mekanisme keluar nonlokal terstruktur.
(throw x)
mengevaluasi x
dan melempar nilai kembali ke yang terbaru catch
.
(throw x <tag>)
melempar nilai x
kembali ke catch
label 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 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") dan signal
untuk meningkatkan kesalahan (yang menunjukkan bahwa ada yang salah "dan dapat memicu acara debug).