2012-09-16 2 views
5

는 거기에 델파이에있는 두 개의 코딩 패턴 사이의 실질적인 차이 :try-except 블록으로 try-finally 블록을 래핑하는 것과 그 반대의 경우는 무엇이 다릅니 까?

버전 1

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

버전 2

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

제쳐두고, 나는 두 번 호출 할 수 있다는 뜻으로 마침내 블록과 관련된 다소 엉뚱한 x64 버그를 발견했습니다! http://qc.embarcadero.com/wc/qcmain.aspx?d=108457 –

+0

코드에 보호 된 리소스가 할당 된 위치가 표시되지 않습니다 (SomeObject.Create). 'do something' 부나 그 이전 단계에 있습니까? – mjn

+0

'finally' 블록과'except' 블록은 모두 똑같은'try' 키워드로 도입되는 것이 유감입니다. 왜냐하면 그렇지 않으면 직각 개념이기 때문입니다. –

답변

6

이 두 가지 차이점이 있습니다

  1. except 및 finally 블록의 상대적 순서가 다릅니다. 버전 1에서는 finally가 except 앞에 실행됩니다. 버전 2에서는 실행 순서가 바뀝니다.
  2. 버전 1에서 finally 블록이 발생하면 except 블록이 처리합니다. 버전 2에서는 finally 블록이 발생하면 예외 처리기가 포함 된 다음 코드 즉이 코드 외부에서 finally 블록이 처리됩니다.

일반적으로 발생시키는 블록이 걱정되지 않습니다. 당신은 단순히 그러한 일이 일어날 것이라고 기대하지 않으며, 그렇게된다면 무언가가 무너질 것입니다.

그래서 차이점은 예외 처리기 전에 마지막으로 실행되는지 아니면 그 반대로 실행되는지 여부입니다. 때로는 중요하지 않지만 종종 차이를 만듭니다.

2

아래 행 try..except을 사용할 때.

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

어떻게 볼 수 없습니까? 이것은 질문 또는 실제로 전혀 관련이 없습니다. 게다가 최선의 방법은 리소스를 보호하고 예외를 더 높은 수준의 코드로 옮기도록하는 것입니다. –

+1

응답자가 'except'블록에서 예외를 처리하면 'finally'블록이 필요 없다는 것을 의미한다고 생각합니다. – kludg

+0

@Serg OK, 그건 맞는 말이야. 그러나, 나는이 코드가 나보다 먼저 나오면 여전히이 코드를 거부합니다. try/finally는 리소스를 보호하는 방법이며 try/finally를 볼 때 그 의미를 알 수 있습니다. 내가 그것을 볼 수 없을 때 나는 생각해야한다. –

관련 문제