2010-11-11 15 views
15

Delphi'de, nasıl denemeyi deneyebilir ve nasıl bir araya getirebilirsiniz? Bir Java/C# eşdeğer gibi görünecektir:C#/Java "Try/Finally/Catch" Delphi'de eşdeğer yapı

try { 
    // Open DB connection, start transaction 
} catch (Exception e) { 
    // Roll back DB transaction 
} finally { 
    // Close DB connection, commit transaction 
} 

sen yapabilirsiniz Delphi bu denerseniz ya Kullanım try/finally veya dışında/deneyin; ama asla üçü birlikte değil. try...except iç içe iken

// initialize/allocate resource (create objects etc.) 
... 
try 
    try 
    // use resource 
    ... 
    except 
    // handle exception 
    ... 
    end; 
finally 
    // free resource/cleanup 
    ... 
end 
+0

Çünkü 'nihayet' ve 'hariç' semantik olarak tamamen farklı, Delphi'de aynı ifadede olamazlar. Sadece 'nihayet' ve 'hariç' kullanılan RTL/VCL kaynaklarına bakın (ve bunların oranı). Yakında bulundukları yerleri pek göremezsiniz. –

+4

"İşlemi gerçekleştir" işlemini "son" satırına koymayın. Bir istisna oluşursa, herhangi bir şey yapmak istemezsiniz. Özellikle önceki "except" bloğunda geri aldığınız bir işlemi yapmayı denemek istemezsiniz. Commit, 'try' bölümünde son eylem olmalıdır. –

cevap

18

Delphi aşağıdaki modeli kullanabilirsiniz: I (derleme değil) Aşağıdaki gibi bir kod istiyorum try...finally (veya tam tersi) içinde, hangi dili kullandığınızdan bağımsız olarak, asıl sorunun, hata kaygılarını karıştırdığına işaret etmek istediğim soruya doğrudan yanıt verilir. taşıma ve kaynak yönetimi. Try...except ve try...finally çirkin. Sizi kodunuzun yaptığı şeyden uzaklaştırıyorlar. Daha iyi bir yaklaşım, ayrı bir yöntem haline hata işleme ayıklamak için geçerli:

procedure Read(Connection: TDBConnection); 
begin 
    try 
    //Read DB 
    except 
    //Handle Exception 
    end; 
end; 

procedure ReadRecord; 
begin 
    DBConnection.Open; 
    Read(DBConnection); 
    DBConnection.Close; 
end; 

Şimdi hata işleme kendine yeten ve sen mutlu yoluna dikkatinizi konsantre böylece göz ardı edilebilir.

Bekleyin! open ve close nedir? Ne istisnalar artırırlarsa?

Basit. Bu işlemleri deneyin ... işlevler dışında sarın ve bunları da ele alın. Gerekli olmamalı. Kullandığınız DB kitaplığı bir istisna değerse open veya close bağlantıyı bilinmeyen bir durumda bırakmaz. Sonra tekrar beklemediğiniz şeyler için istisnalar var.

Aynı teknik, herhangi bir kaynakla kullanılabilir: nesne oluşturma, dosya erişimi, vb. İşlevinizin gövdesinin bir istisna yükseltmeyeceği garanti edildiğinde try...finally gereksizdir.

Elbette, işlev çağrısı genel yükü vardır, ancak çoğu durumda önemsizdir ve hata işleme işlevleriniz, derleyicinin bunları satır içine almasına izin verecek kadar küçük olmalıdır.

+0

Parlak. Yuvalamanın, beklenen okunabilirliği nasıl taklit ettiğini seviyorum (nihayet Java/C# 'dan alıyorum). – ashes999

+0

İlk önce bunu Java'da öğrendim ve Delphi'ye “taşıdım”;) – mjn

+2

Bunun dışında gereksiz düzeyde çentik ekler. Ben gerçekten onlar deneyin yazmak mümkün olmasını isterdim ... Tamamen ... daha fazla, hatta daha iyi eğer rastgele sırada (daha önce işlenen ne bağlı olarak), ve daha da iyisi eğer yapmak mümkün olurdu "deneyin ..exinally..except B ... sonu ". Kodlama konusunda gerçekten bu kadar fazla değil, dili de zorlaştırıyor, ancak hoş bir dokunuş katıyor. – himself

9

yazma

try 
    // allocate resource here 
    try 
    finally 
    // free resource here 
    end; 
except 
    // handle exception here 
end; 
+2

Mjustin'in cevabı olarak eşit derecede işlevsel, ama daha fazlasını severim - istisnanın önce yakalandığını ve sonunda blokun sonunda geldiğini daha okunabilir yapar. Ya da belki sadece önyargılı olduğumdan beri Java/C# stili :) – ashes999

+5

mjustin'in cevabı yok edici özel durumları yakalamıyor. Bu daha iyi bir yaklaşım. – gabr

+3

Bu zor, @ Gabr. Bir yıkıcı istisnalar atıyorsa, çoktan ölüsün. Programınızın böyle bir hataya neden olan sorunu çözmek için yapabileceği hiçbir şey yoktur. –

4

:

try 
    // Open DB connection, start transaction 
except on e: Exception do 
begin 
    // Roll back transaction 
end 
finally // Compiler error: expected "END" not "finally" 
begin 
    // Commit transaction 
end 
+0

+1. Ne yazık ki, benim soru semantical değil, saf sözdizimidir. – ashes999