अपवाद त्रुटियों के सामान्यीकरण के रूप में विकसित हुए। एक अपवाद तंत्र को शामिल करने वाली पहली प्रोग्रामिंग भाषा 1970 के दशक की शुरुआत में लिस्प थी। गेब्रियल और स्टील द्वारा ए पैटर्न ऑफ़ लैंग्वेज इवोल्यूशन में एक अच्छा सारांश है। यदि कोई त्रुटि होती है, तो प्रोग्राम के व्यवहार को निर्दिष्ट करने की आवश्यकता से अपवाद (जिसे अभी तक अपवाद नहीं कहा गया था) उत्पन्न हुआ। एक संभावना कार्यक्रम को रोकना है, लेकिन यह हमेशा मददगार नहीं है। लिस्प क्रियान्वयन परंपरागत रूप से एक त्रुटि पर डिबगर में प्रवेश करने का एक तरीका रहा है, लेकिन कभी-कभी प्रोग्रामर अपने कार्यक्रम में त्रुटि हैंडलिंग को शामिल करना चाहते थे। इसलिए 1960 के दशक के लिस्प कार्यान्वयन को यह कहने का एक तरीका था कि "ऐसा करें, और यदि कोई त्रुटि होती है, तो इसके बजाय ऐसा करें"। मूल रूप से त्रुटियों को आदिम कार्यों से आया था, लेकिन प्रोग्रामर ने प्रोग्राम के कुछ हिस्से को छोड़ने और त्रुटि हैंडलर पर कूदने के लिए जानबूझकर त्रुटि को ट्रिगर करना सुविधाजनक पाया।
1972 में, लिस्प में अपवाद से निपटने का आधुनिक रूप MacLisp में दिखाई दिया: throw
और catch
। सॉफ्टवेयर संरक्षण समूह सहित जल्दी लिस्प कार्यान्वयन, पर सामग्री का एक बहुत कुछ को सूचीबद्ध डेविड मून द्वारा MACLISP संदर्भ मैनुअल संशोधन 0 । आदिम catch
और throw
itives5.3 p.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>
या बिना लेबल वाले बैक के मान को फेंकता है ।
ध्यान गैर- नियंत्रण नियंत्रण प्रवाह पर है। यह गोटो का एक रूप है (ऊपर की ओर केवल गोटो), जिसे जंप भी कहा जाता है । रूपक यह है कि कार्यक्रम का एक हिस्सा अपवाद हैंडलर पर वापस जाने के लिए मान फेंकता है, और अपवाद हैंडलर उस मान को पकड़ता है और उसे वापस करता है।
अधिकांश प्रोग्रामिंग लैंग्वेज आज टैग और वैल्यू को एक अपवाद ऑब्जेक्ट में पैक करती हैं, और एक हैंडलिंग मैकेनिज्म के साथ कैचिंग मैकेनिज्म को जोड़ती हैं।
अपवाद जरूरी त्रुटियां नहीं हैं। वे कोड के एक ब्लॉक से और आसपास के ब्लॉक से बाहर निकलने का एक तरीका हैं, अपवाद के लिए एक हैंडलर तक भागने से। क्या इस तरह की बात को सहज अर्थ में "त्रुटि" माना जाता है।
कुछ भाषाएं "त्रुटि" और "अपवाद" शब्दों के बीच अंतर करती हैं। उदाहरण के लिए, कुछ लिस्प बोलियों में throw
एक अपवाद को बढ़ाने के लिए है (उपयोगकर्ताओं के लिए नियंत्रण प्रवाह, एक गैर-स्थानीय निकास को एक तरह से निष्पादित करने का मतलब है कि यह इंगित नहीं करता है कि कुछ भी "गलत" हुआ) और signal
एक त्रुटि उठाने के लिए (जो इंगित करता है कि कुछ "गलत" चला गया और एक डिबग घटना को ट्रिगर कर सकता है)।