2012-09-16 14 views
5

Czy istnieje praktyczna różnica pomiędzy dwoma wzorami kodowania w Delphi:Czym różni się zawijanie bloku try-finally od bloku try-except i na odwrót?

Wersja 1

try 
    try 
    {Do something} 
    finally 
    {Do tidy up} 
    end 
except 
    {Handle exception} 
end; 

Wersja 2

try 
    try 
    {Do something} 
    except 
    {Handle exception} 
    end 
finally 
    {Do tidy up} 
end; 
+5

Na marginesie znalazłem raczej zwariowany błąd x64 związany z ostatnimi blokami, co oznacza, że ​​mogą zostać wywołane dwa razy! http://qc.embarcadero.com/wc/qcmain.aspx?d=108457 –

+0

Kod nie pokazuje miejsca przydzielenia chronionego zasobu (SomeObject.Create). Czy jest to w części "zrób coś" lub wcześniej? – mjn

+0

To niefortunne, że 'finally' blocks i' except' blocks są wprowadzane z tym samym słowem kluczowym 'try', ponieważ w przeciwnym razie są to pojęcia ortogonalne. –

Odpowiedz

6

Są dwie różnice:

  1. Kolejna kolejność wykonywania bloków except i finally różni się. W wersji 1, w końcu wykonuje się przed wyjątkiem. W wersji 2 zamówienie wykluczające jest odwrócone.
  2. W wersji 1, jeśli blok finally zostanie podniesiony, to będzie obsługiwany przez blok except. W wersji 2, jeśli blok finally zostanie podniesiony, będzie on obsługiwany przez następny program obsługi wyjątku, tj. Poza tym kodem.

Zazwyczaj nie przejmujesz się ostatnimi blokami, które podbijają. Po prostu nie spodziewasz się, że tak się stanie, a jeśli tak, coś prawdopodobnie jest bardzo zepsute.

Różnica polega na tym, czy ostatecznie działa przed procedurą obsługi wyjątku, czy na odwrót. Czasami to nie ma znaczenia, ale często robi różnicę.

2

Podczas korzystania z try..except poniżej wykonanych linii.

Resource := TAbstractResource.Create; 
try 
    Resource.DoSomeThing; 
except 
    On E:Exception Do 
    HandleException(E); 
end; 
FreeAndNil(Resource); 
+0

Nie widzę jak odnosi się to do pytania, a nawet do wszystkiego. Co więcej, najlepszą praktyką jest używanie w końcu do ochrony zasobów i dopuszczanie wyjątków do kodu wyższego poziomu. –

+1

Myślę, że odbierający miał na myśli, jeśli poradzisz sobie z jakimkolwiek wyjątkiem w bloku 'except', nie musisz blokować' finally'. – kludg

+0

@Serg OK, to miałoby sens. Jednak nadal odrzuciłbym ten kod, gdyby kiedykolwiek został mi przedstawiony. Spróbuj/w końcu to, jak chronić zasoby i kiedy widzę próbę/w końcu, wiem, co to znaczy. Kiedy go nie widzę, muszę myśleć. –

Powiązane problemy