Hata kontrolü sizce nasıl yapılmalı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
erdem55
Üye
Mesajlar: 22
Kayıt: 18 Mar 2014 06:54

Hata kontrolü sizce nasıl yapılmalı

Mesaj gönderen erdem55 » 27 Şub 2018 01:14

Merhaba arkadaşlar,
Hazırlamakta olduğum bir program da tereddüt etmekteyim. Aşağıda örneğini verdiğim kodlama da hata kontrolü sizce nasıl gerçekleştirilmeli. Yani sağlıklı olan sizce nedir.

Kod: Tümünü seç

Procedure TForm1.KayitKontrol(Sender: TObject);
Begin
  //Kaydın daha önce kayıt edilip edilmediği kontrol ediliyor.
  KaydiKaydet(Sender);
End;

Procedure TForm1.KaydiKaydet(Sender: TObject);
Begin
  //Kayıt işlemi yapılıyor.
End;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Try
    Try
      Begin
        table1.open;
        table2.open;
        table3.open;
        KayitKontrol(Sender);
      End;
    Finally
      Begin
        table1.Close;
        table2.Close;
        table3.Close;
      End;
    End;
  Except
    //Hata Kontrol
  End;
end;
Bu şekilde mi yapsam yoksa;

Kod: Tümünü seç

Procedure TForm1.KayitKontrol(Sender: TObject);
Begin
  Try
    //Kaydın daha önce kayıt edilip edilmediği kontrol ediliyor.
    KaydiKaydet(Sender);
  Except
    //hata kontrolü
  End;
End;

Procedure TForm1.KaydiKaydet(Sender: TObject);
Begin
  Try
    //Kayıt işlemi yapılıyor.
  Except
    //hata kontrolü
  End;
End;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Try
    Try
      Begin
        table1.open;
        table2.open;
        table3.open;
        KayitKontrol(Sender);
      End;
    Finally
      Begin
        table1.Close;
        table2.Close;
        table3.Close;
      End;
    End;
  Except
    //Hata Kontrol
  End;
end;
bu şekilde mi daha sağlıklı olur. Yada başka bir öneriniz olur mu?

ertank
Üye
Mesajlar: 1141
Kayıt: 11 Eyl 2015 11:45

Re: Hata kontrolü sizce nasıl yapılmalı

Mesaj gönderen ertank » 27 Şub 2018 05:09

Merhaba,

Eğer özel durum (exception) her iki örnekte de "KaydiKaydet(Sender: TObject);" prosedürü içinde tam olarak kontrol altına alınacak ise ikinci örnek EXE boyutu biraz daha büyük olmak dışında bir farkları olmayacaktır.

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2078
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: Hata kontrolü sizce nasıl yapılmalı

Mesaj gönderen freeman35 » 28 Şub 2018 09:20

table, query class larında onposterror, ondeleteerror vs gibi eventleri var. Herzaman söylüyorum, kullandığınız class ları merak edin, içinde neler var ne işe yarar öğrenin.
Hata kontolü hatayı yakalamak değildir, hatayı engellemektir. her yere try bloğu koymak, arabayı çarpa çarpa gideceği yere yönlendirmekle aynıdır. Try blok ları, sizin kotrolünüzde şartları yakalayabilmek içindir.
Örnek: Tabloda not null bir field a veri girildiğinde bunu post a yakalamak değil, post etmeden önce kotrol etmek.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

erdem55
Üye
Mesajlar: 22
Kayıt: 18 Mar 2014 06:54

Re: Hata kontrolü sizce nasıl yapılmalı

Mesaj gönderen erdem55 » 28 Şub 2018 04:49

ertank yazdı:
27 Şub 2018 05:09
Merhaba,

Eğer özel durum (exception) her iki örnekte de "KaydiKaydet(Sender: TObject);" prosedürü içinde tam olarak kontrol altına alınacak ise ikinci örnek EXE boyutu biraz daha büyük olmak dışında bir farkları olmayacaktır.
Öncelikle cevabınız için teşekkür ederim. Bende sizin gibi düşünmüştüm ama akıl akıldan üstündür dedim ve belki benim aklıma gelmeyen bir yorum olur diye yazmak istedim. Tekrar teşekkürler.
freeman35 yazdı:
28 Şub 2018 09:20
table, query class larında onposterror, ondeleteerror vs gibi eventleri var. Herzaman söylüyorum, kullandığınız class ları merak edin, içinde neler var ne işe yarar öğrenin.
Hata kontolü hatayı yakalamak değildir, hatayı engellemektir. her yere try bloğu koymak, arabayı çarpa çarpa gideceği yere yönlendirmekle aynıdır. Try blok ları, sizin kotrolünüzde şartları yakalayabilmek içindir.
Örnek: Tabloda not null bir field a veri girildiğinde bunu post a yakalamak değil, post etmeden önce kotrol etmek.
Merhaba Freeman35 öncelikle try except buloğunu kullanmamın nedeni, verileri webbrowser üzerinden yani internetten çektiğim için o anda internet nedeni ile de olabilecek hataları düşünerek kodlamalar içindeki tüm hataları yakalamak istememden kaynaklıydı.
Yanıtınız için tekrar teşekkür ederim.

kerpeten
Üye
Mesajlar: 62
Kayıt: 26 May 2016 12:31

Re: Hata kontrolü sizce nasıl yapılmalı

Mesaj gönderen kerpeten » 01 Mar 2018 03:22

freeman35 çok önemli bir konuya parmak basmış. Gerçekten bu doğru. Sayısal olması gereken bir alanı Try bloğuyla kontrol etmek saçma. Ancak ekrabda birçok bilgi girildikten sonra program bilinmeyen bir hata veriyor ve kullanıcı programı bile normal kapatamıyor. İşte bunun engellenmesi lazım. Bu açıdan Try bloğu kullanmak önemli. Örneğin bir kaydı düzeltmeye başlamadan önce Transaction başlatılmalı ve hemen try konulmalı, bunu Except'le bitirmeli. Except kısmında rollback olmalı. Normal hatasız akışta ise commit olmalı.
Bu konuda aslında bir standart konulamaz. Her işi yaptığınız duruma göre bunu da düşünmeniz gerekiyor.
Bir de Except kullanıldığında çok dikkatli olmak gerekli. Eğer burada bir exception Raise etmezseniz buna silence exeption deniyor ki bu da çok tehlikeli. Yanlış kullanılırsa hata veren yerler sanki hiç hata vermiyormuş gibi devam eder ve programcıyı yanıltır. Genelde bunu kullanmamak gerekir, kullanıldığında da aynı exception'u tekrarlamak gerekir.
Yani şunun gibi; (Ancak böyle bile dikkatli olmak gerekir.)

Kod: Tümünü seç

   DB.StartTranaction;
   Try
     ...
     DB.Commit;
   Except
     on e:Exception do
     begin
       DB.Rollback;
       Raise Exception.Create(e.Message);
     end;
   end;

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2078
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: Hata kontrolü sizce nasıl yapılmalı

Mesaj gönderen freeman35 » 01 Mar 2018 12:02

@erdem55 Kontrolün dışındadan kastettiğim bir başka örnek senin kullandığın webbrowser class ları gibi. Ama bu class ları incelek gerek, bunların hata kotrol leri mutlaka vardır, yani gavur class kendi içinde olasılıkları hesaplamıştır, mesela timeout yada adress bulunmadı vs gibi. bunların haricinde kotroller için kullanılabilinir. Ben sadece senin örneğine özel yazmadım, konuyu okuyan her öğrenmek isteyene fikir vermek için, genele yazıyorum.

@kerpeden Yazdıkların doğru, ama bana eksik geliyor. Şöyle ki: Verdiğin örnekten gidelim, ilk mesajımda yazdım onposterror vs eventleri var, onlar bu işler için. Commit vs işlemi için ayrıca try bloğu gereksiz. bahsettiğim eventleri inceleyin, gelen parametrelerin ne olduğunu inceleyin. o eventler bu işler için. ben try except i çok nadir kullanırım, daha çok try finally kullanırım. Örnek: o anlık bir iş için bir bileşen create ettim mesela tstringlist Bunu her halukarda freeandnil edeceksem gibi.

Kod: Tümünü seç

   
      Try
   DB.StartTranaction;// --> ya hata oluşturursa ? o yüzden block içinde olmalı
     ...     
     DB.Commit;
   Except
     on e:Exception do
     begin
       if DB.InTransaction then DB.Rollback;// --> Kullanılan bileşenle alakalı bazı componentlar burdada transaction başlamamış diye hata verebilir.
       Raise Exception.Create(e.Message);
     end;
   end;
basit örnek, diğer eventlerde eklenirse beforedelete ondeleteerror vs gibi işte bana göre progracılık budur, yani olasılık hesabı yapmak, bir try bloğuna ihtiyaç duyulmaz. Hele bunu, bir ana form haline getirir ve diğer formları bundan türetirseniz benim gibi, bunları yazdığınızı dahi unutur, bu işlemler kendinden zaten oluyor diye düşünürsünüz :)

Kod: Tümünü seç

xxxxx.xxxBeforeInsert(DataSet: TDataSet);
begin
  if not (_Write in Yetkile) then begin
    showmessage(yetkin yok)
    Abort;
  end;
end;

Kod: Tümünü seç

procedure TFRM_.xxxxxPostError(DataSet: TDataSet; E:
    EDatabaseError; var Action: TDataAction);
begin
    if Pos('UNIQUE', UpperCase(E.Message))>0then Begin
     Action := daAbort;
     Application.MessageBox(PWideChar('Bu tanım daha önce girilmiş !'), PChar(Application.Title), msg_Ok);
    end;
end;

Kod: Tümünü seç

procedure TFRM_.xxxxAfterPost(DataSet: TDataSet);
begin
  if TRA_W.Active then TRA_W.CommitRetaining;
  //Generate_Event;
end;

Kod: Tümünü seç

procedure TFRM_.xx_AfterCancel(DataSet: TDataSet);
begin
  if TRA_W.Active then TRA_W.RollbackRetaining;
end;
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

kerpeten
Üye
Mesajlar: 62
Kayıt: 26 May 2016 12:31

Re: Hata kontrolü sizce nasıl yapılmalı

Mesaj gönderen kerpeten » 01 Mar 2018 12:23

DB.StartTransaction Try bloğunun başlangıcında olmalıdır. StartTransaction'da hata verirse zaten başlamamış demektir.
Dolayısıyla bloğun finish ya da except'ine düşmesine gerek yok. O olmayınca da except kısmındaki hata olarak yazdığınız da geçersiz oluyor. Yani benim yazdığımda bir hata yok, ancak programlama felsefenize uygun olmayabilir, onu eleştirirsiniz ona eyvallah.
Sonuç olarak;
Bu benim kullandığım yol. Siz başka bir yol kullanıyorsunuz, o da sizin yolunuz. Ben buraya varana kadar onlarca program yazmışım, siz de o noktaya varana kadar 5-10-15 (sayısını bilmiyorum ama vardır o kadar diye düşünüyorum) yazmışsınız. Burada hangisi doğru diye tartışmanın anlamı yok. Bir sonuca erişmek için birden fazla yol vardır, kimi o yoldan gider kimi başka yoldan.

erdem55
Üye
Mesajlar: 22
Kayıt: 18 Mar 2014 06:54

Re: Hata kontrolü sizce nasıl yapılmalı

Mesaj gönderen erdem55 » 01 Mar 2018 02:17

freeman35 ve kerpeten her ikinize de ayrı ayrı teşekkür ederim. kerpeten ili aynı mantıkla ilerliyormuşum. freeman35 in verdiği örnekte kullanılabilir sanırım biraz da alışkanlık ile alakalı bir konu. Tekrar teşekkür ederim.

Cevapla