Винятки складалися як узагальнення помилок. Перша мова програмування , щоб включити механізм виключення був Lisp на початку 1970 - х років. Хороший підсумок у «Шаблоні еволюції мови» Габріеля та Стіла. Винятки (які ще не називались винятками) виникли через необхідність уточнення поведінки програми у разі виникнення помилки. Одна з можливостей - зупинити програму, але це не завжди корисно. У реалізаціях Lisp традиційно був спосіб ввести відладчик з помилкою, але іноді програмісти хотіли включити обробку помилок у свою програму. Тож у 1960-х реалізаціях Lisp з'явився спосіб сказати "зроби це, і якщо станеться помилка, зроби це замість цього". Спочатку помилки походили від примітивних функцій, але програмістам було зручно свідомо запускати помилку, щоб пропустити частину програми та перейти до обробника помилок.
У 1972 році в MacLisp з'явилася сучасна форма обробки винятків у Lisp: throwand 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викликати помилку (що вказує на те, що щось пішло «не так» і може викликати події налагодження).