İstisna hiyerarşileri teorisi var mı?


18

Bir şekilde istisnaları olan bir düzine programlama diline aşinayım, ancak iki "patolojik" eğilime tanık oldum.

  1. Ortak bir kalıp veya istisnalar hiyerarşisi yok gibi görünüyor. Her dil temel olarak kendi sürümünü kullanır ve istisnalar standarda dönüştürürse, standartta bulunan istisna türleri oldukça keyfi olacaktır (çoğunlukla kaynak kodunu okumak gibi dil araçları oluştururken uygulananlar) dize veya hata ayıklayıcıyı çağırmak için bir istisna veya dosya bulunamadığında oluşan bir istisna vb.)

  2. Dil tarafından tanımlanan istisnalar, kullanıcı programları tarafından çok nadiren yeniden kullanılır. Genellikle bir veya iki popüler istisna söz konusudur (örneğin "uygulanmaz"). Çoğu zaman programcılar kendi istisnalarını yaratacaktır. (Örneğin, yeni sayısal türler veya yeni koleksiyon türleri oluşturma ile karşılaştırın).

Bu benim için korkunç bir ihmal gibi görünüyor. Kullanıcı programlarında ne tür hatalara ihtiyaç olacağını kimse bilmiyor? Sayısal türlere, koleksiyonlara, nesne sistemine vb. Benzer hoş bir hiyerarşi olmasını umuyordum.

Daha da kötüsü, Goolge ve Wikipedia bu konuda çok az yardım sağlıyor. Şimdiye kadar sadece bir pasajda açılan fonksiyonel istisna hakkında bir makale buldum:

Bu makale, tembel fonksiyonel programlamanın yalnızca yerleşik istisna yönetim mekanizmasını gereksiz kılmakla kalmayıp, istisnalar kullanan programlar geliştirmek ve dönüştürmek için güçlü bir araç sağladığını savunuyor.

(İşlevsel Bir İstisnalar Teorisi, Mike Spivey, 1988)

Ama istisnaların iyi olduğunu düşünüyorum. İstisnalar kullanan programları dönüştürmek istemiyorum, aksine istisnaların kullanımını daha az kaotik yapmak istiyorum.

Soru:

İstisnalar teorisi var mı? Eğer öyleyse, buna ne denir? Varsa temel taşı temelini oluşturan temel taş nedir?


istisnalar, C'nin "longjmp" sından biraz ortaya çıkan, belki de 20 yıldan daha eski olan oldukça yeni bir buluştur. çoğunlukla OOP ile bağlantılıdır. ideal bir kullanım / teori / en iyi uygulamaların hala gelişim aşamasında olduğu görülmektedir. java daha ayrıntılı modellerden birine sahiptir. not ettiğiniz gibi istisnalar ile ilgili birçok "karşıtlık" vardır. bunların bir kısmı, genel olarak bebeklik döneminde de görünen "hataya dayanıklı hesaplama" teorisine bağlıdır.
vzn

İstisnaları bir devam teorisinin alt kümesi olarak düşünebilirsiniz. Bkz en.wikipedia.org/wiki/Continuation
jmite

@jmite İstisnalar ve devamlar çok farklı. İstisnalar işleyicilerine dinamik olarak bağlanırken, devamlar bunu statik olarak yapar. Genel olarak, en azından türlerin varlığında istisnaları uygulamak için kendi başlarına süreklilikler kullanılamaz, bkz. Örneğin Yazılan İstisnalar ve Devamlar Birbirlerini Makro İfade Edemez .
Martin Berger

"Dil tarafından tanımlanan istisnalar, kullanıcı programları tarafından çok nadiren yeniden kullanılır." Bu çok doğru! Özel istisnaları tanımlamak çok nadiren gereklidir. Örneğin python ve stdlib'i 160 istisna gibi bir şey tanımlar. Düşündüğünüz istisnanın tanımlanma şansı çok azdır. Bu istisnaların bazıları (en çok?) Geniş ölçüde bilinmemektedir. Örneğin, her özel konteyner LookupErroriçin mükemmel olur , ancak birçok insan var olduğunu bile bilmiyorum.
Bakuriu

1
@jmite Bu konudan önce istisnalarla karşılaştığım bir diğer karşılaşma Benjamin C. Pierce'ın Türleri ve Programlama Dilleri kitabından geldi. Burada bir tür fonksiyon tanımlamak bağlamında hatalardan bahseder. Yani, bakış açısından, hatalar işlevlerden döndürülen başka bir değerdir (ve diğer argümanla birlikte, söyleyebileceğim bir tür oluştururlar).
wvxvw

Yanıtlar:


8

İstisnalarla ilgili çok az sayıda yayın var, teorik incelemeler oldukça az. İşte bazı örnekler ile yapılandırılmamış ve tam listeden uzak. Üzgünüz, şu anda daha odaklı bir cevap için vaktim yok.

  • B. Randell, Yazılım Hata Toleransı için Sistem Yapısı.
  • JB Goodenough. İstisna yönetimi: Sorunlar ve önerilen gösterim.
  • JB Goodenough. Yapısal istisna işleme.
  • BG Ryder, ML Soffa, İstisna İşleme Tasarımına Etkileri.
  • D. Teller, A. Spiwack, T. Varoquaux, Yapabiliyorsanız beni yakalayın: OCaml'de tip-güvenli, hiyerarşik, hafif, polimorfik ve verimli hata yönetimine doğru.
  • X. Leroy, F. Pessaux, Yakalanmayan istisnaların tür temelli analizi.
  • R. Miller, A. Tripathi, Nesneye Yönelik Sistemlerde İstisna İşleme Sorunları.
  • S. Drew, KJ Gough, J. Ledermann, Sıfır Tepegöz İstisna İşleme Uygulamak.
  • B. Stroustrup, İstisna Güvenlik: Kavramlar ve Teknikler.
  • D. Malayeri, J. Aldrich, Pratik İstisna Spesifikasyonları.
  • H. Nakano, Yakalama ve Atma Mekanizmasının Yapıcı Biçimlendirilmesi.
  • A. Nanevski, İstisna İşleme için Kalıcı Bir Analiz.
  • P. de Groote, İstisna İşleme Basit Bir Analiz.
  • H. Thielecke, Devlet Varlığında İstisnalar ve Devamlar Üzerine.
  • JG Riecke, H. Thielecke, Yazılan İstisnalar ve Devamlar Birbirlerini Makro Ekspresleyemez.
  • M. van Dooren, E. Steegmans, Kontrol Edilen İstisnaların Sağlamlığını Bağlantılı İstisna Beyanları Kullanarak Kontrol Edilmeyen İstisnaların Esnekliği ile Birleştirin.
  • JA Vaughan, Java tarzı istisnaların mantıklı bir yorumu.
  • S. Marlow, S. Peyton Jones, A. Moran, Haskell'deki Eşzamansız İstisnalar.
  • B. Jacobs, F. Piessens, Hata Kutuları: Muhtemel Güvenli İstisna İşleme.

Vay canına, çok teşekkürler! Olumlu cevap ile geri almak için bana birkaç ay sürecek (daha fazla değilse) :) Şimdi nereden başlayacağımı bilmeyen birkaç kitap arasında parçalandım!
wvxvw

2
Bu makalelerin çoğu, istisna hiyerarşilerinin nasıl tasarlanacağı değil, programlama dillerinde istisnaların uygulanması veya modellenmesiyle ilgilidir. Listeyi ilgili makalelere ayırabilir misiniz?
Gilles 'SO- kötü olmayı bırak

@Gilles Orijinal soru biraz belirsizdi. Uygun istisnalar olarak sayılan şeyin çoğunlukla uygulamaya bağlı olduğunu düşünüyorum. İstisnalar ile ilgili tek gerçek teorik problem, (1) ilgisiz modülleri istisnalar ile birleştirmek (bu nedenle Java'nın zorunlu istisna spesifikasyonlarına sahip bir dil olmadığından) arasındaki, ve (3) hata işleme konusunda derleyici yardımı. Görebildiğim kadarıyla, bu bilmeceye henüz gerçekten ikna edici bir çözüm bulunamadı.
Martin Berger

6

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 throwve 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 .


Bu ilginç ve daha iyi cevap vermek için daha fazla araştırma yapmam gerekecek. Ancak şu ana kadar: C ++ 'da istisnalar kullanmak için çok güçlü bir itiraz olduğunu biliyorum (belki bir fıkra, ancak iirc Google kodlama kuralları istisnaların kullanımını yasaklamak için kullanılır). Java tarafından kontrol edilen istisnalar kesinlikle benzersiz ve bu nedenle ilginç bir deneydir, ancak özellik geçmişi boyunca çok fazla kötü kredi kazanmıştır ... çoğu insan bunları zamanında çalışır (her ne kadar sözdizimi ile ilgili olsa da).
wvxvw

Common Lisp istisnaların sınıflandırılmasına daha çok aşinayım, burada (çok az başarı olsa da) onları programa yönelttikleri tehdit düzeyine göre ayırmaya çalıştılar. mesela serious-conditionvs simple-condition. Ayrıca şimdi sistemin görevi yerine getiremediğine göre gruplara hataları (programlama ile ilgili olmayan) sınıflandırdığı JL Austing'i okuyorum (ör. Samimiyet dışı niyetlere karşı kullanılan uygunsuz parçalar). Bu, programlama için hemen geçerli değildir, ancak bazı iyileştirmelerden sonra olabilir.
wvxvw

@Genişleyen Mantık C ++ excpetios'un neden sux olduğunu ve özelliklerin eğitimli bir şekilde dahil edilmesinin dili tahrip edebileceğini açıkladığınız için kusuyorum.
Val

@wvxvw very strong objectionC ++ 'da istisnalara karşı iki gerçek vardır: finallyyapı yoktur ve başka kimse istisna kullanmaz. İlk sorun ikincisini de ağırlaştırmaktadır. Yani, finallyHayır'ınız olduğunda, istisna olduğunda kaynağı kapatamazsınız. Kimse istisnalar kullanmadığından, tüm işlevler / API'ler bunlardan kaçınır, kodunuzdan faydalanmaya başlamak için tüm işlevleri istisnalarınızla saran tüm geleneksel C ++ altyapısını yeniden inşa etmek için çok yatırım yapmanız gerekir. Ancak finallybu yaklaşımı eksikliği de imkansız kılmaktadır.
Val

@wvxvw: Google'ın sözleşmeleri modül (.so) sınırlarına istisnalar atmayı yasaklıyor. Bunun nedeni, C ++ istisnalarının çalışma zamanı türü bilgilerini (RTTI) kullanması ve Linux'un çalışma zamanı yazmayı uygulamak için iyi bir iş yapmadığıdır. Linux'ta çalışma zamanı türlerini yalnızca aynı derleyicinin aynı sürümüne sahip modülleri derlediyseniz ve aynı libstdc ++ sürümüne bağladıysanız modüller arasında güvenilir bir şekilde geçirebilirsiniz. Gerçekten bu, C ++ 'ın genel olarak Linux topluluğu tarafından reddedilmesidir, özel olarak istisnaların reddedilmesi değildir.
Gezici Mantık

3

Sadece istisnaların bir hesaplama etkisi örneği olduğuna dikkat edeyim . Diğer hesaplamalı etkiler değişebilir durum, I / O, determinizm dışı, süreklilik ve diğerleri. Böylece sorunuz daha genel bir şekilde sorulabilir: hesaplama etkisi hiyerarşilerini nasıl oluştururuz, onları nasıl düzenleriz ve neden başkalarına değil de sahip olduklarımıza vb. Sahibiz.


1
Bence bu tamamen alakasız. Soru, istisnalar kavramını modellemekle ilgili değildir, ama onu hatalarla eşleştirmekle ilgilidir - Bence onu PLT perspektifinden tanımlamanın doğru yolu istisna hiyerarşileri teorisi olacaktır.
Gilles 'SO- kötü olmayı bırak'

Hmm, haklısın. Bunu belirtmek için cevabı düzelttim, ama silmeye gerek olmadığını düşünüyorum. Ne düşünüyorsun?
Andrej Bauer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.