İstisnalar, hataların genelleştirilmesi olarak gelişti. Bir istisna mekanizması içeren ilk programlama dili 1970'lerin başında Lisp oldu. Gabriel ve Steele'in Bir Dil Gelişimi Örüntüsünde iyi bir özet var.. İstisnalar (henüz istisnalar olarak adlandırılmadı), bir hata meydana gelirse bir programın davranışını belirleme gereğinden doğmuştur. Bir olasılık programı durdurmaktır, ancak bu her zaman yardımcı olmuyor. Lisp uygulamaları geleneksel olarak hata ayıklayıcısına bir hatayla girmenin bir yolunu buldu, ancak bazen programcılar programlarına hata işlemeyi dahil etmek istediler. Öyleyse 1960'larda Lisp uygulamaları “bunu yapın ve bir hata olursa o zaman bunu yapın” demenin bir yolu vardı. Başlangıçta hatalar ilkel işlevlerden geldi, ancak programcılar programın bir bölümünü atlamak ve hata işleyicisine atlamak için kasıtlı olarak bir hatayı tetiklemenin uygun olduğunu gördüler.
1972'de Lisp'teki modern istisna yönetimi MacLisp'te ortaya çıktı: throw
ve catch
. Yazılım Koruma Grubu dahil erken Lisp uygulamaları, üzerinde birçok materyal listeler David Moon MACLISP Referans El Revizyon 0 . İlkel catch
ve throw
§5.3 sayfa 43'te belgelenmiştir.
catch
yapılandırılmış yerel olmayan çıkışlar yapmak için LISP işlevidir. (catch x)
değerlendirme x
sırasında değerlendirilmesi x
(throw y)
gereken durumlar dışında, değerlendirme yapılmadan catch
derhal geri y
dönmesi dışında değerlerini değerlendirir ve verir x
.
catch
iç içe geçmiş avları birbirinden ayırmak için bir etiket olarak kullanılan, değerlendirilmemiş, bir eşdeğer argümanıyla da kullanılabilir. (...)
throw
catch
yapısal bir yerel olmayan çıkış mekanizması olarak kullanılır .
(throw x)
x
değeri değerlendirir ve en yeniye geri döndürür catch
.
(throw x <tag>)
x
geri değerini, catch
etiketli <tag>
veya etiketsiz olarak etiketlenmiş en son değere atar .
Odak lokal olmayan kontrol akışı üzerinde. Bu, bir sıçrama olarak da adlandırılan bir goto şeklidir (sadece yukarı doğru bir goto) . Mecaz programının bir parçası olmasıdır atar istisna işleyicisi dönmek için değeri ve istisna işleyicisi yakalar bu değer ve iadeler o.
Günümüzde çoğu programlama dili, bir istisna nesnesindeki etiketi ve değeri paketler ve yakalama mekanizmasını bir taşıma mekanizmasıyla birleştirir.
İstisnalar mutlaka hata değildir. Bir kod bloğundan ve çevresindeki bloklardan çıkmanın bir istisnası için işleyiciye ulaşana kadar kaçmanın bir yoludur. Böyle bir şeyin sezgisel anlamda “hata” olarak kabul edilip edilmediği özneldir.
Bazı diller “hata” ve “istisna” terimleri arasında ayrım yapar. Örneğin, bazı Lisp lehçelerinin hem throw
bir istisna oluşturması (kullanıcılar için kontrol akışını, herhangi bir şeyin “yanlış” gittiğini göstermeyecek şekilde yerel olmayan bir çıkış gerçekleştirmesi anlamına gelmesi) ve hem signal
de bir hata oluşturması gerekir (ki bu bir şey “ters gitti” ve hata ayıklama olayı tetikleyebilir).