Các ngoại lệ phát triển như một khái quát của các lỗi. Các ngôn ngữ lập trình đầu tiên bao gồm một cơ chế ngoại lệ là Lisp trong đầu những năm 1970. Có một bản tóm tắt hay trong Mô hình tiến hóa ngôn ngữ của Gabriel và Steele. Các ngoại lệ (chưa được gọi là ngoại lệ) xuất phát từ nhu cầu chỉ định hành vi của chương trình nếu xảy ra lỗi. Một khả năng là tạm dừng chương trình, nhưng điều này không phải lúc nào cũng hữu ích. Theo truyền thống, việc triển khai Lisp đã có một cách để sửa lỗi cho trình gỡ lỗi, nhưng đôi khi các lập trình viên muốn đưa vào xử lý lỗi trong chương trình của họ. Vì vậy, những năm 1960, việc triển khai Lisp đã có cách để nói rằng thực hiện điều này và nếu có lỗi xảy ra thì hãy thực hiện thay vào đó. Các lỗi ban đầu xuất phát từ các hàm nguyên thủy, nhưng các lập trình viên thấy thuận tiện khi cố tình kích hoạt một lỗi để bỏ qua một phần của chương trình và chuyển sang xử lý lỗi.
Năm 1972, hình thức xử lý ngoại lệ hiện đại ở Lisp đã xuất hiện trong MacLisp: throw
và catch
. Các phần mềm bảo tồn Nhóm liệt kê rất nhiều tài liệu về hiện thực Lisp sớm, bao gồm các MACLISP Reference Manual Revision 0 David trăng . Các nguyên thủy catch
và throw
được ghi lại trong §5.3 tr.43.
catch
là chức năng LISP để thực hiện các lối thoát không cục bộ có cấu trúc. (catch x)
đánh giá x
và trả về các giá trị của nó, ngoại trừ rằng nếu trong quá trình đánh giá x
(throw y)
nên được đánh giá, catch
ngay lập tức trả về y
mà không cần đánh giá thêm x
.
catch
cũng có thể được sử dụng với một đối số econd, không được đánh giá, được sử dụng làm thẻ để phân biệt giữa các sản phẩm khai thác lồng nhau. (Càng)
throw
được sử dụng catch
như là một cơ chế thoát không có cấu trúc.
(throw x)
đánh giá x
và ném giá trị trở lại gần đây nhất catch
.
(throw x <tag>)
ném giá trị x
trở lại vào catch
nhãn gần đây nhất có nhãn <tag>
hoặc không ghi nhãn.
Trọng tâm là dòng điều khiển phi tiêu điểm . Đó là một hình thức của goto (một goto chỉ hướng lên), còn được gọi là một bước nhảy . Phép ẩn dụ là một phần của chương trình ném giá trị để trả về trình xử lý ngoại lệ và trình xử lý ngoại lệ bắt giá trị đó và trả về nó.
Hầu hết các ngôn ngữ lập trình ngày nay đều đóng gói thẻ và giá trị trong một đối tượng ngoại lệ và kết hợp cơ chế bắt với cơ chế xử lý.
Ngoại lệ không nhất thiết là lỗi. Chúng là một cách để thoát khỏi một khối mã và từ các khối xung quanh, thoát ra cho đến khi đạt được một trình xử lý ngoại lệ. Cho dù một điều như vậy được coi là một lỗi lỗi khắc nghiệt trong ý nghĩa trực quan là chủ quan.
Một số ngôn ngữ tạo ra sự khác biệt giữa các thuật ngữ lỗi Lỗi và lỗi ngoại lệ. Ví dụ, một số phương ngữ Lisp vừa throw
đưa ra một ngoại lệ (luồng điều khiển cho người dùng, có nghĩa là thực hiện một lối thoát không cục bộ theo cách không chỉ ra rằng bất cứ điều gì đã xảy ra sai lầm) và signal
gây ra lỗi (điều đó cho thấy rằng một cái gì đó đã bị lỗi sai và có thể gây ra một sự kiện gỡ lỗi).