Bir sistemin istisnaları düzgün bir şekilde iletmesi ve işlemesi için birçok gereksinim vardır. Bir dilin konsepti uygulamak için seçebileceği birçok seçenek de vardır.
İstisnalar için gereklilikler (belirli bir sırada değil):
Belgeler : Bir dil, bir API'nın atabileceği istisnaları belgelemek için bir araç içermelidir. İdeal olarak bu dokümantasyon aracı, derleyicilerin ve IDE'lerin programcıya destek sağlamasına izin vermek için makinede kullanılabilir olmalıdır.
İstisnai Durumlar İletin : Bu, bir işlevin, çağrılan işlevin beklenen eylemi gerçekleştirmesini engelleyen durumları iletmesine izin vermek için açıktır. Bence bu tür durumların üç büyük kategorisi var:
2.1 Bazı verilerin geçersiz olmasına neden olan koddaki hatalar.
2.2 Yapılandırma veya diğer harici kaynaklardaki sorunlar.
2.3 Doğası gereği güvenilir olmayan kaynaklar (ağ, dosya sistemleri, veritabanları, son kullanıcılar vb.). Güvenilmez nitelikleri ara sıra başarısızlıklarını beklememizi gerektireceğinden, bunlar bir köşe olayıdır. Bu durumda bu durumlar istisnai kabul edilir mi?
Kod ile başa çıkmak için yeterli bilgi sağlayın : İstisnalar, çağrıya tepki göstermesi ve durumu ele alması için yeterli bilgi sağlamalıdır. bilgiler de, bu istisnaların günlüğe kaydedildiğinde, rahatsız edici ifadeleri tanımlamak ve izole etmek ve bir çözüm sunmak için bir programcıya yeterli bağlam sağlaması için yeterli olmalıdır.
Programcıya kodunun yürütme durumunun mevcut durumu hakkında güven sağlama : Bir yazılım sisteminin istisna işleme yetenekleri, programcının yolundan uzak dururken gerekli önlemleri sağlayacak kadar mevcut olmalıdır; el.
Bunları kapsamak için çeşitli dillerde çeşitli yöntemler uygulanmıştır:
Kontrol Edilen İstisnalar İstisnaları belgelemek için harika bir yol sağlar ve teorik olarak doğru uygulandığında her şeyin iyi olduğuna dair geniş bir güvence sağlamalıdır. Bununla birlikte, maliyet, birçok kişinin ya istisnaları yutması ya da denetlenmeyen istisnalar olarak yeniden atması için daha verimli olduğunu düşünecek şekildedir. Uygun olmayan şekilde kontrol edilen istisnalar kullanıldığında, tüm kullanışlılığı hemen hemen kaybeder. Ayrıca, kontrol edilen istisnalar, zaman içinde kararlı olan bir API oluşturmayı zorlaştırır. Belirli bir etki alanı içindeki genel bir sistemin uygulamaları, yalnızca denetlenen istisnalar kullanılarak sürdürülmesi zor olacak istisnai durum yükünü getirecektir.
Denetlenmeyen Özel Durumlar - işaretli özel durumdan çok daha çok yönlüdür ve belirli bir uygulamanın olası istisnai durumlarını düzgün bir şekilde belgeleyemezler. Hiç değilse geçici belgelere güvenirler. Bu, bir ortamın güvenilir olmayan doğasının güvenilirlik görünümü veren bir API tarafından maskelentiği durumlar yaratır. Ayrıca bu istisnalar atıldığında, soyutlama katmanları boyunca geri giderken anlamlarını kaybederler. Kötü bir şekilde belgelendirildiklerinden, bir programcı bunları özel olarak hedefleyemez ve genellikle ikincil sistemlerin, başarısız olmaları durumunda, tüm sistemi düşürmemelerini sağlamak için gerekenden çok daha geniş bir ağ kullanmaları gerekir. Bu da bize sağlanan yutma sorun kontrol istisnalar geri getiriyor.
Çok aşamalı döndürme türleri Burada beklenen sonucu veya istisnayı temsil eden bir nesneyi döndürmek için ayrık bir kümeye, tuple veya benzer bir konsepte güvenmek gerekir. Burada yığın çözme yok, kod kesme yok, her şey normal çalışıyor, ancak devam etmeden önce hata için dönüş değeri doğrulanmalıdır. Bu konuda henüz çalışmadım, bu yüzden deneyimden yorum yapamıyorum, normal akışı atlayarak bazı sorunları istisnaları çözdüğünü kabul ediyorum, ancak yine de yorucu ve sürekli "yüzünüzde" olmak üzere kontrol edilen istisnalarla aynı sorunlardan muzdarip olacak.
Soru şu:
Bu konudaki deneyiminiz nedir ve size göre bir dile sahip olmak için iyi bir istisna yönetim sistemi yapmak için en iyi aday hangisidir?
EDIT: Bu soruyu yazdıktan birkaç dakika sonra bu yazı rastladım ürkütücü!
noexcept
C ++ hikayesine bakmak C # ve Java da EH için çok iyi bilgiler verebilir.)