Винятки складалися як узагальнення помилок. Перша мова програмування , щоб включити механізм виключення був Lisp на початку 1970 - х років. Хороший підсумок у «Шаблоні еволюції мови» Габріеля та Стіла. Винятки (які ще не називались винятками) виникли через необхідність уточнення поведінки програми у разі виникнення помилки. Одна з можливостей - зупинити програму, але це не завжди корисно. У реалізаціях Lisp традиційно був спосіб ввести відладчик з помилкою, але іноді програмісти хотіли включити обробку помилок у свою програму. Тож у 1960-х реалізаціях Lisp з'явився спосіб сказати "зроби це, і якщо станеться помилка, зроби це замість цього". Спочатку помилки походили від примітивних функцій, але програмістам було зручно свідомо запускати помилку, щоб пропустити частину програми та перейти до обробника помилок.
У 1972 році в MacLisp з'явилася сучасна форма обробки винятків у Lisp: throw
and catch
. Збереження Group Software перераховує багато матеріалу на ранніх реалізаціях Lisp, включаючи The Maclisp Reference Manual Revision 0 Девід Місяця . Примітиви catch
і throw
задокументовані в §5.3 с.43.
catch
є функцією LISP для здійснення структурованих не локальних виходів. (catch x)
оцінює x
та повертає свої значення, за винятком випадків, коли під час оцінювання x
(throw y)
слід оцінювати, catch
негайно повертається y
без додаткової оцінки x
.
catch
може також використовуватися з контурним аргументом, не оціненим, який використовується як тег для розмежування вкладених уловів. (…)
throw
використовується catch
як структурований нелокальний механізм виходу.
(throw x)
оцінює x
та повертає значення до останнього catch
.
(throw x <tag>)
x
повертає значення назад до останнього, catch
позначеного міткою <tag>
або без маркування.
Основна увага приділяється нелокальному контрольному потоку. Це форма гото (тільки вгору гото), яку ще називають стрибком . Метафора полягає в тому, що одна частина програми передає значення для повернення до обробника винятків, а обробник винятків ловить це значення і повертає його.
Більшість мов програмування сьогодні пакують тег та значення у об’єкт винятку та поєднують механізм лову з механізмом обробки.
Винятки - це не обов'язково помилки. Вони є способом виходу з блоку коду та з навколишніх блоків, уникаючи обробника для виключення. Чи вважається така річ «помилкою» в інтуїтивному розумінні суб’єктивно.
Деякі мови розрізняють терміни "помилка" та "виняток". Наприклад, деякі діалекти Lisp мають як throw
створити виняток (потік управління для користувачів, який мав на увазі виконувати не локальний вихід таким чином, що не вказує на те, що щось пішло «не так»), так і signal
викликати помилку (що вказує на те, що щось пішло «не так» і може викликати події налагодження).