Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
try finally ve except arasındaki fark
#1
Arkadaşlar merhaba. Herkese hayırlı ramazanlar.
Yıllardır delphi ile yazılım geliştiriyorum ama aşağıdaki konuda kafam çok karıştı ben mi yanlış hatırlıyorum yoksa oruç başımıza mı vurdu anlamadım Smile

Soru şu:

try
.......işlemler
finally
...... son işlemler
end;

burada try içinde yazılı kodlarda eğer hata gelirse kullanıcının karşısına hata mesajı geliyor ve program duruyor kullanıcı ok'e basınca finally bloğu işletiliyor.


try
.......işlemler
except
end;
...... son işlemler


burada kullanıcının karşısına hata mesajı gelmiyor ve except den sonraki bölüm yine işletiliyor.

Şimdi ben yanlışmı hatırlıyorum try finally arasına bişey yazdığımızda kullanıcıya hata mesajı gitmemesi gerekiyordu.
Yani kafa durmuş durumda Smile
Cevapla
#2
try ... finally bloğunda

* Hatanın nedeni sizin için ikinci önem sırasındadır.
Hata size dahi rapor edilmez. Edilsin istenirse bunun için içeriye ikincil bir kontrol noktası kurmanız gerekir. 
Hata oluşsun veya oluşmasın finally ... end; arasında kalan kısım çalıştırılır.

try ... except bloğunda

* Hatanın nedeni sizin için birinci önem sırasındadır.
Hatayı dizginlemek için kullanılır.
Hata size rapor edilir ama kullanıcıdan gizlenir sadece siz bilirsiniz. ( debug aşamasında IDE gösterir )
Kullanıcıya kendi tarzınızda bunu loglayabilir, mesajla bildirebilir veya gizleyebilirsiniz.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(11-03-2025, Saat: 20:55)mrmarman Adlı Kullanıcıdan Alıntı: try ... finally bloğunda

* Hatanın nedeni sizin için ikinci önem sırasındadır.
Hata size dahi rapor edilmez. Edilsin istenirse bunun için içeriye ikincil bir kontrol noktası kurmanız gerekir. 
Hata oluşsun veya oluşmasın finally ... end; arasında kalan kısım çalıştırılır.

try ... except bloğunda

* Hatanın nedeni sizin için birinci önem sırasındadır.
Hatayı dizginlemek için kullanılır.
Hata size rapor edilir ama kullanıcıdan gizlenir sadece siz bilirsiniz. ( debug aşamasında IDE gösterir )
Kullanıcıya kendi tarzınızda bunu loglayabilir, mesajla bildirebilir veya gizleyebilirsiniz.

Teşekkür ederim hocam. Yani şunu söylememiz doğrumu dur; try finally arasında bir hata olursa bu hata kullanıcının karşısına gelir fakat program kırılmaz finally bloğu işletilir.
Cevapla
#4
Hata gelmez Finally Çalışır.. 
Hatayı siz de bilemezsiniz.

try Finally (kullanıcı hata görür) ve Try Except (kullanıcı hata görmez) kurduğunuzda kullanıcı yakasında program kırılmaz.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
(11-03-2025, Saat: 21:00)mrmarman Adlı Kullanıcıdan Alıntı: Hata gelmez Finally Çalışır.. hatayı siz de bilemezsiniz.

Hata kullanıcıya geliyor hocam. Benimde konuyu açma nedenim buydu gerçekten kafam çok karıştı. Hata kullanıcının karşısına geliyor ok diyor finally bloğu çalışıyor. Hata sonrasındaki kısım çalışmıyor doğal olarak.
Cevapla
#6
Şöyle bir örnek kurabilirsiniz.


procedure TForm1.BitBtn1Click(Sender: TObject);
var
  a, b : Integer;
begin
  a := 10;
  b := 0;
  try
    showmessagefmt('Sıfıra bölme hatası... %d', [ a/b]);
  finally
    showmessage( 'Try Finally Kullanıcı "Hatayı GÖRÜR !!!"');
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  a, b : Integer;
begin
  a := 10;
  b := 0;
  try
    showmessagefmt('Sıfıra bölme hatası... %d', [ a/b]);
  except
    showmessage( 'Try Except Kullanıcı "Hata Görmez..."');
  end;
end;


Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#7
(11-03-2025, Saat: 21:08)mrmarman Adlı Kullanıcıdan Alıntı: Şöyle bir örnek kurabilirsiniz.


procedure TForm1.BitBtn1Click(Sender: TObject);
var
  a, b : Integer;
begin
  a := 10;
  b := 0;
  try
    showmessagefmt('Sıfıra bölme hatası... %d', [ a/b]);
  finally
    showmessage( 'Try Finally Kullanıcı "Hatayı GÖRÜR !!!"');
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  a, b : Integer;
begin
  a := 10;
  b := 0;
  try
    showmessagefmt('Sıfıra bölme hatası... %d', [ a/b]);
  except
    showmessage( 'Try Except Kullanıcı "Hata Görmez..."');
  end;
end;



Aynen hocam tam olarak benim de dediğim buydu. try finally arasında çıkan hatayı kullanıcı görür ve kullanıcı tamam diyene kadar finally bloğu çalıştırılmaz program durur.
Sizin verdiğiniz örneği de hemen denedim aynı sonuca ulaştım.
Çok teşekkürler @mrmarman hocam.
Cevapla
#8
Birde not olarak raise argumanı var. İçe içe ilerleyen fonksiyonlarınız var ve bu alt katmanlarda oluşan hatayı üst katmanlara taşımak isterseniz. raise; denemiz yeterli olacaktır.
function TXxxx.LogicalProcess(): Boolean;
begin
  try
    SubProcess(15,25);
  except
    //oluşan hatayı burada ve alt katmanların hepsinde yakalamış oldunuz. 
    //buradaki mesaj: Another Process Hatası Hata1 \n Başka bir mesaj
  end;
end;

function TXxxx.SubProcess(a,b: Double): Double;
begin
  try
    ..//birşeryler yaptınız
    AnotherProcess()
    //..birşeyler yapacaksınız
  except
    //birşeyler yaptınız.
    E.Message := E.Message + sLineBreak + 'Başka bir mesaj'
    raise;
  end;
end;

procedure TXxxx.AnotherProcess();
begin
  try
    ...//hata oluşan satır
    ...
  except
    on E: Exception do
    begin
      //birşeyler yaptınız.
      E.Message := 'Another Process Hatası Hata1';
      raise;
    end;
  end;
end;
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#9
(12-03-2025, Saat: 08:37)3ddark Adlı Kullanıcıdan Alıntı: Birde not olarak raise argumanı var. İçe içe ilerleyen fonksiyonlarınız var ve bu alt katmanlarda oluşan hatayı üst katmanlara taşımak isterseniz. raise; denemiz yeterli olacaktır.
function TXxxx.LogicalProcess(): Boolean;
begin
  try
    SubProcess(15,25);
  except
    //oluşan hatayı burada ve alt katmanların hepsinde yakalamış oldunuz. 
    //buradaki mesaj: Another Process Hatası Hata1 \n Başka bir mesaj
  end;
end;

function TXxxx.SubProcess(a,b: Double): Double;
begin
  try
    ..//birşeryler yaptınız
    AnotherProcess()
    //..birşeyler yapacaksınız
  except
    //birşeyler yaptınız.
    E.Message := E.Message + sLineBreak + 'Başka bir mesaj'
    raise;
  end;
end;

procedure TXxxx.AnotherProcess();
begin
  try
    ...//hata oluşan satır
    ...
  except
    on E: Exception do
    begin
      //birşeyler yaptınız.
      E.Message := 'Another Process Hatası Hata1';
      raise;
    end;
  end;
end;

Bilmemek değil öğrenmemek ayıptır diye boşuna dememişler. @3ddark hocam sayenizde yeni bir şey öğrenmiş oldum. Teşekkürler.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Nesneler arasındaki ilşkiyi/bağlantıyı tespit etmek 41linea41 2 2.782 14-09-2019, Saat: 13:09
Son Yorum: 41linea41
  podesktopcenter (vs) poscreencenter Arasındaki Fark [ÇÖZÜLDÜ] SenayAkgun 6 6.406 30-01-2019, Saat: 00:00
Son Yorum: SenayAkgun
  İki saat arasındaki fark ssmr 7 6.396 12-01-2019, Saat: 22:06
Son Yorum: savasabd
  Activex ile normal kurulum arasındaki fark Lord_Ares 4 4.927 11-03-2018, Saat: 23:15
Son Yorum: Lord_Ares
  iki tarih ve saat arasındaki ay gün ve saat farkı erdogan 2 3.769 31-12-2017, Saat: 19:25
Son Yorum: adelphiforumz



Konuyu Okuyanlar: 1 Ziyaretçi