hata işleme hangi örnek doğru

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
htopdas
Üye
Mesajlar: 24
Kayıt: 07 Nis 2006 09:34

hata işleme hangi örnek doğru

Mesaj gönderen htopdas »

bende 2 tane hata işleme örneği var birini bu formda bi arkadaş söyledi
1.si

try
Query1.Close;
Query1.SQL.Clear;
sorgu:='Insert into ........
Query1.SQL.Add(sorgu);
Query1.ExecSQL;
except on e:Exception do
Begin
ShowMessages('Kayıt Eklenemedi!..');
end;
2.si

Query1.Close;
Query1.SQL.Clear;
sorgu:='Insert into ........
Query1.SQL.Add(sorgu);
try
Query1.ExecSQL;
expect
on e:Exception do
Begin
ShowMessages('Kayıt Eklenemedi!..');
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from tablo');
Query1.open;
end;
bunlardan hangisi doğru yada 2 side doğrumu try ın yerinin değişmesi farkedermi sınava gircemde yanlış yapmak istemiyorum
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Bence bu.

Kod: Tümünü seç

Query1.Close; 
Query1.SQL.Clear; 
sorgu:='Insert into ........ 
Query1.SQL.Add(sorgu); 
try 
Query1.ExecSQL; 
expect 
on e:Exception do 
Begin 
ShowMessages('Kayıt Eklenemedi!..'); 
Query1.Close; 
Query1.SQL.Clear; 
Query1.SQL.Add('select * from tablo'); 
Query1.open; 
end;
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Hepsi yanlış :)

Önemli olan hangi hazır kodun doğru olduğu değil. Bu kodların ne yaptığı senin ne yapmak istediğin.

Kod: Tümünü seç

Query1.Close; 
Query1 açık değilse nasıl kapatacaksın.

Kod: Tümünü seç

if Query1.Active then Query1.Close; 
olabilir mesela.

Kod: Tümünü seç

Query1.SQL.Clear; 
sorgu:='Insert into ........ 
Query1.SQL.Add(sorgu); 
Bu kısımda istisna olasılığı düşük try bloğu içinde olması elzem değil.

Kod: Tümünü seç

try 
 Query1.ExecSQL; 
 expect on e:Exception do 
 Begin 
  ShowMessages('Kayıt Eklenemedi!..'); 
  Query1.Close; //QUERY1 AÇIK MI Kİ BENCE DEĞİL
  Query1.SQL.Clear; 
  Query1.SQL.Add('select * from tablo'); 
  Query1.open; // İSTİSNA YÖNETİMİ YOK
 end;
Yine aynı hata Query1 açılmamış kapatılmak isteniyor. Sonrada istisna denetimi olmadan açılmak isteniyor.

Evet dediğim gibi amacınıza (senaryo) uygun bilerek kod yazmalı (her bir komutun ne işe yaradığını, her bir satırın ne iş yaptığını ). Sağdan soldan alınan kodları kopyalayıp yapıştırarak bu iş olmaz malesef.

Kolay gelsin.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

poshet303 yazdı:Query1 açık değilse nasıl kapatacaksın.
Merhaba,
Açık olmayan bir query i kapatmak neden istisnaya sebep olsun ki ya da ne gibi bir zararı var.
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

vkamadan yazdı:
poshet303 yazdı:Query1 açık değilse nasıl kapatacaksın.
Merhaba,
Açık olmayan bir query i kapatmak neden istisnaya sebep olsun ki ya da ne gibi bir zararı var.
İyi çalışmalar.
+1
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Açık olmayan bir query i kapatmak neden istisnaya sebep olsun ki ya da ne gibi bir zararı var.
Bende bir istisnaya sebep olduğunu iddea etmiyorum zaten.
Hatasız çalıştığıda doğrudur. Fakat hatasız çalışıyor olması VCL yi yazanların bazı şeyleri kontrol etmesinden kaynaklanıyor olmalı.

Burda genel prensiplerin ihlalinden bahsediyoruz.
Olmayan bir sistem kaynağına erişemezsiniz ve onu serbest bırakamazsınız. .Close çağrısını kontrolsüz yapmaya alışan disiplinsiz bir programcı yarın;

Kod: Tümünü seç

 AssignFile(a,'olmayan dosya');
 CloseFile(a);
Şeklindede bir kod yazar. CloseFile fonksiyonunu yazanlar burda a nın geçerli bir kaynağa işaret edip etmediğini kontrol etmedikleri için program çöker.

Program yazarken kullandığınız sınıf ve fonksiyonları yazanların her şeyi düşünmüş olduklarına her zaman güvenebilir misiniz? Yazdığınız programın sağlamlığını şansa mı bırakacaksınız?
Tercih meselesi.
htopdas
Üye
Mesajlar: 24
Kayıt: 07 Nis 2006 09:34

Mesaj gönderen htopdas »

ben zaten bu kodların ikisinide yaptığım projede kullanabiliyorum ve ikiside çalışıyor fakat bunlar bir programda kullanılmayacak, sonuçta sınav sorusu ama tabiki en doğrusunu yapmamız gerekiyor burada hocanın istediği aslında hata işleme,programdan çok hata işleme kontrolüne bakıyor,onun için Querynin açık olup olmaması çok da önemli değil yapılmak istenen ise(soru) verilen alanlara(ad,soyad..) göre Query kullanılarak ekleme,silme...yapılacak ve bunların herbirinde hata kontrolü işlenecek benim istediğimde try-except bloğunu kodun tam neresine yerleştirileceğini ve hangi hata mesajının kullanılması gerektiğini öğrenmek, aynı hata mesajını silme de kullanarak (silinemedi) veya güncellemede (güncellenemedi) şeklinde yazabilirmiyim.[/quote]
En son htopdas tarafından 10 Tem 2006 11:34 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Hatanın Satırı

Mesaj gönderen sabanakman »

Burada öenmli olan hata çıkabilecek satırın try'dan sonra except'ten önce olmasıdır. Verdiğin örnekte hata çıkması muhtemel tek satır var o da "Query1.ExecSQL;" olduğundan her ikisi de doğrudur. Önemle vurgulamak istediğim nokta HATA ÇIKARABİLECEK SATIRIN ya da SATIRLARIN try-except ARASINA YAZILMASIDIR.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

...delphiden sınava gireceğim ve burda hocanın istediği aslında hata işleme,programdan çok hata işleme kontrolüne bakıyor,onun için Querynin açık olup olmaması çok da önemli değil...
Her şeyin ders geçmek için olduğunu keşke başta söyleseydiniz. Bizde programlama prensipleri falan diye yırtınıyoruz boşuna.
Ülkemizde ders geçmek için bunlar gerekmiyor. Bende bu şekilde mezun oldum :)
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Önemle vurgulamak istediğim nokta HATA ÇIKARABİLECEK SATIRIN ya da SATIRLARIN try-except ARASINA YAZILMASIDIR.
Hata çıkarabilecek satırları nasıl bilebiliriz.

bir örnek

Kod: Tümünü seç

...
 Query1.Sql.Free; //ben acemiyim clear yerine free yazmışım. yada başka nedenle
... // kodlarımı yazmışım.
//belki bu yordamdan çıkmışta olabilirim. Bu yordamda yada başka yordamda şu çağrıyı yapmam gerekti.

 Query1.SQL.Add('select hata from tumdenariza');//Yukarıdaki kodda buna benzer çağrı vardı.
paranoyakça mı oldu biraz. isterseniz programı komple try...except bloğuna alalım.
Yalnız sorun şu; istisnayı yakaladık. İyi de şimdi ne yapacaz?
mceL
Üye
Mesajlar: 56
Kayıt: 28 Eyl 2003 01:19
Konum: Bursa
İletişim:

Mesaj gönderen mceL »

try , except gereksiz yere kullanılmamalıdır zaten.

Kod: Tümünü seç

Query1.Sql.Free;
bu bir yazılımcı hatasıdır. ama eğer ki bir sorguyu etkin kılacaksınız, dönen sonuç hata verir örneğin bağlantı yoktur, bu hata sizin dışınızda gerçekleşir, onu kontrol etmek amaçlı try except arasına alırsınız. Neden alırsınız, çünkü en azından klasik "zonk" diye çıkan hatayı özelleştirirsiniz, hata olarak bunu bir dosyaya yazarsınız vs...
Kısacası, programcının kodları dışında oluşabilecek hataları yakalamak amaçlı kullanılmalıdır. Veritabanı açılırken, sorgu açılırken gibi, intToStr da girilen değişkenin yanlışlığını yakalarken vs...
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

try-except

Mesaj gönderen sabanakman »

Programcı kodlarını yazarken kontrollü gitmelidir. Her satırda ne yaptığını bilmelidir. Hatta satırlar toplamında ne gibi bir işlem olduğunu da. Eğer bileşenleri işi bitince yok ediyorsa o zaman kullanacağı zamanda da oluşturmalıdır. Konu eğer try-except ise o zaman sezgisel olarak hangi satırdan veya satırlardan hata geleceğini bilmelidir. Bunu da kontrol altına almak için try-except kullanmalıdır. Mesela sıfıra bölme bir hatadır. Ama biz bunu göz ardı ederek kullanıcıdan giriş yapmasını beklmişsek ve oda girmemiş veya sıfır girmiş ise o zaman bir hata ortaya çıkacaktır. Bu if ile kontrol etmek yerine hata kontrolü yaparak da gerçekleştirilebilir.

Kod: Tümünü seç

try
  Ortalama=Toplam/Oran;
  .
  .
except
  ShowMessage('Ortalama girilmediği için hesaplama yapılamaz.');
end;
fakat burada başka satırlarda bulunmaktadır ve hata diğerlerinden de gelebilir. O zaman ne yapmalı. Çözümün ortaya çıkan hata üzerinden kontrol yapılması olduğu ortaya çıkacaktır.

Kod: Tümünü seç

try
  Ortalama=Toplam/Oran;
  .
  .
except
  on E:Exception do begin {Ortaya çıkan hata E nesnesidir. E bir hata nesnesi tipinde değişkendir ve bu begin end bloğu içinde kulanılabilir. İllaki E ismi verilmek zorunda da değildir.}
    if E is EDivByZero then ShowMessage('Ortalama girilmediği için hesaplama yapılamaz.')
  else ShowMessage(E.Message);{diğer satırlarda ortaya çıkan hatanın orjinal mesajı.}
  end;
end;
burada EDivByZero hata nesnesi borland tarafından VCL içinde SysUtils.pas içinde tanımlanmıştır. Bunun gibi daha bir çok ERangeError,EIntError,EIntOverflow ... hata işleyen nesne bulunmaktadır. Sıfıra bölmeyi basit bir if deyimi kullanarak yapabiliriz ama maksat hata işleyişini anlatmak olduğu için böyle bir örnek kullandım. İnşallah açıklayıcı olmuştur.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla