Forum: D Programlama Dili RSS
Throwable veya Error değil, Exception
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Throwable veya Error değil, Exception
Atılabilen hata sıradüzenlerinin en tepesinde Throwable var. Atılabilen bütün hatalar onun altındaki iki sınıftan türüyor:

            Throwable
             ↗      ↖
    Exception       Error
      ↗    ↖        ↗    ↖
    ...    ...    ...    ...

Kendi hatalarımızı Error'dan mı yoksa Exception'dan mı türeteceğimizden emin olamıyordum; TDPL'i okuyunca anladım:

- Ya doğrudan Exception atın, ya da Exception'dan türemiş olan bir tür atın

- Error'dan türemiş olan türleri veya Throwable'ı yakalamayın

Kolay... :) TDPL, Error veya Throwable'ın yakalanmasının tanımsız davranış olduğunu söylüyor.

D.ershane bu konuda hatalı; çünkü Throwable'ı "catch eden" bazı örnekler var. Onları da düzelteceğim. (Aslında düzelttim ama henüz siteye koymadım.)

Ali
canalpay (Moderatör) #2
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Error'u program hataları ve Exception'ı da kullanıcı hataları olarak mı algılamalıyız ?

- Error'dan türemiş olan türleri veya Throwable'ı yakalamayın
Yakalamamızın tanımsız davranış olmasının nedeni ne olarak açıklanmış ? Eğer Error program hatası ise error olarak tanımlanan hatayı yakalayacağınıza hatayı düzeltin demeye mi getirmişler ?
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bunların ikisi de program hatası olarak algılanmalı. Kullanıcı hatalarının kullanıcıya temiz bir şekilde duyurulması daha doğru olur. Bunlar programın kendi hataları ile ilgili. Örneğin yazdığımız bir kütüphane işlevi yanlış bir şekilde çağrılıyordur.

Aslında ben de her durumda tam emin olamıyorum. Digital Mars forumunda 'enforce' başlıklı uzun bir konu var...

TDPL, Error sıradüzenine kesinlikle karışmamamız gerektiğini söylüyor. Onu, ikinci bir hata düzeneği gibi düşünebiliriz. Biz araya karışınca, derleyicinin oluşturduğu kodların işini bozabiliyormuşuz. Kural 1: O yüzden Error veya Throwable tutmayacağız.

Kesinlikle doğru olduğunu bildiğimiz koşulları assert ile denetleriz ya... İşte o denetim AssertError atar. Giderilemez bir durumdur, çünkü kesinlikle doğru olması beklenen bir koşulun yanlış olması, tanım gereği, yanlış bir urumdur... ;)

Bu noktada, std.contracts modülündeki enforce'u hatırlamak gerekiyor. TDPL de zaten onu öneriyor. enforce da assert gibi kullanılıyor, ama AssertError değil, Exception atıyor. O da programın doğruluğu ile ilgili ama Exception attığı için, onu yakalanması uygun olan durumlar için düşünüyoruz.

[Pes: Kitabı daha dün okuduğum halde ayrımını şimdi bile yapamıyorum. :)]

Bu ayrımın Java'da da olduğunu duymuştum. Giderilemez hatalar için Error; yakalanabilen, dolayısıyla hataya karşılık bir şeylerin yapılabildiği durumlar için Exception...

Şimdi dmd/src/phobos/std/ dizinindeki dosyalar içinde 'enforce' aratıyorum ve Andrei'nin onu hangi durumlara uygun bulduğunu anlamaya çalışıyorum. :D Örneğin 'reduce' işlevi, kendisine verilen aralığın boş olmamasını şart koşuyormuş. Bunu, enforce(!r.empty); ile denetliyor. Ben de neredeyse "biz de kendi kodlarımızda hep enforce kullanmalıyız" diyeceğim ama tam da emin olamıyorum.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 09:26:22 (UTC -08:00)