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
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

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.
(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.
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.
(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.
Şö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;
(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.
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;
(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.