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