Bir teori olup olmadığını bilmiyorum, ama ortaya çıkan pragmatik deneysel bir bilim olabilir.
Aklıma gelen en iyi kaynak Bjarne Stroustrup, C ++ Tasarımı ve Evrimi, Addison-Wesley, 1994 . Doğru hatırlıyorsam (çok iyi bir kitap ve insanlar benden ödünç alıp geri vermiyorlar, bu yüzden şu anda bir kopyam yok) istisnalar hakkında bir bölüm var. Stroustrup yönetimindeki C ++ komitesi, önerilen bir özelliğin dil tanımına eklemek istemeden önce gerekli olduğuna dair birçok ampirik kanıt gerektiriyordu. İstisnalar hakkında Vikipedi sayfası o kitaptan aşağıdaki alıntı sahiptir:
Kasım 1991'deki Palo Alto [C ++ standardizasyonu] toplantısında, Jim Mitchell'in (eski adıyla Xerox PARC'den) hem kişisel deneyim hem de verilerle desteklenen fesih anlambilimine ilişkin argümanların parlak bir özetini duyduk. Jim, 20 yıllık bir süre boyunca yarım düzine dilde istisna yönetimi kullanmış ve Xerox Cedar / Mesa sisteminin ana tasarımcılarından ve uygulayıcılarından biri olarak devam eden anlam semantiğinin erken savunucusu olmuştur. Onun mesajı fesih, yeniden başlamaya göre tercih edildi; bu bir fikir meselesi değil, yılların tecrübesi meselesidir. Yeniden başlatma baştan çıkarıcıdır, ancak geçerli değildir. Bu ifadeyi çeşitli işletim sistemlerinden gelen deneyimlerle destekledi. Anahtar örnek Cedar / Mesa idi: Özgeçmişi seven ve kullanan insanlar tarafından yazılmıştır, ancak on yıllık kullanımdan sonra, yarım milyon hat sisteminde tek bir özgeçmiş kullanımı kaldı ve bu bir bağlam araştırmasıydı. Böyle bir bağlam sorgusu için özgeçmiş aslında gerekli olmadığından, bunu kaldırdılar ve sistemin o kısmında önemli bir hız artışı buldular. Özgeçmişin kullanıldığı her bir durumda - on yıl boyunca - bir sorun haline gelmiş ve yerini daha uygun bir tasarım almıştır. Temel olarak, her bir özgeçmiş kullanımı, ayrı soyutlama seviyelerinin ayrık kalmamasını temsil etmiştir. Özgeçmişin kullanıldığı her bir durumda - on yıl boyunca - bir sorun haline gelmiş ve yerini daha uygun bir tasarım almıştır. Temel olarak, her bir özgeçmiş kullanımı, ayrı soyutlama seviyelerinin ayrık kalmamasını temsil etmiştir. Özgeçmişin kullanıldığı her bir durumda - on yıl boyunca - bir sorun haline gelmiş ve yerini daha uygun bir tasarım almıştır. Temel olarak, her bir özgeçmiş kullanımı, ayrı soyutlama seviyelerinin ayrık kalmamasını temsil etmiştir.
C ++ 'da gerçek kazanç RAII'dir , bu da hatalar sırasında kaynak ayırma işlemini çok daha kolay hale getirir. (Bu ihtiyacını ortadan yapmaz throw
ve try
- catch
, ancak bu ihtiyacı yoktur demektir finally
.)
Onları istisnalar gerektiğine ikna eden şey genel kapsayıcılar olduğunu düşünüyorum: kapsayıcı yazar içerdiği nesnelerin geri dönmesi gerekebilecek hata türleri hakkında hiçbir şey bilmiyor (çok daha az nasıl ele alınacak), ancak bu nesneleri yerleştiren kod container, bu nesnelerin arayüzünün ne olduğu hakkında bir şeyler bilmelidir. Ancak içerilen nesnelerin ne tür hatalar atabileceği hakkında hiçbir şey bilmediğimiz için, istisna türlerinde standartlaşamayız. (Aksine: İstisna türlerini standartlaştırabilseydik, istisnalara ihtiyacımız olmazdı.)
İnsanların yıllar boyunca öğrendikleri bir diğer şey, istisna şartnamelerinin bir dile doğru şekilde konulması zor olmasıdır. Örneğin buna bakın: http://www.gotw.ca/publications/mill22.htm veya bu: http://www.gotw.ca/gotw/082.htm . (Ve sadece C ++ değil, Java programcıları da kontrol edilmiş veya kontrol edilmemiş istisnalarla ilgili deneyimleri hakkında uzun tartışmalara sahiptir .)
İstisnaların tarihi hakkında biraz. Klasik makale: John B. Goodenough: "İstisna yönetimi: sorunlar ve önerilen bir gösterim" Commun. ACM 18 (12): 683-696, 1975. Ancak bundan önce istisnalar biliniyordu. Mesa yaklaşık 1974'te vardı ve PL / ben de vardı. Ada'nın 1980'den önce bir istisna mekanizması vardı. C ++ istisnalarının en çok Barbara Liskov'un CLU programlama diliyle ilgili 1976 yılındaki deneyimden etkilendiğine inanıyorum. Barbara Liskov: Programlama dilleri tarihi --- II , Thomas Bergin, Jr. ve Richard G. Gibson, Jr. (Eds.). s. 471-510, ACM, 1996 .