2011-08-25 3 views
6

다른 주제에 대해서도 토론 된 것을 알고 있습니다. 제가 묻는 것은 정확하게이 질문의 제목입니다.Delphi - finally 블록은 컴파일러에서 올바르게 실행되도록 보장합니까?

try/finally가 실행되지 않는 경우가 있습니까? 이런 일이 수 있다면 나는/finally 블록을 사용할 수 있어야하는 try..except에 대해 이야기하고 있지 않다

try 
    //some error here 
finally 
    //code that MUST be executed 
end; 

은, 그냥 부탁 해요.

LE : Application.Terminate/unplug 컴퓨터는 특별한 경우입니다.

+2

컴파일러는 전 세계 또는 사용자의 PC를 넘어서는 어떠한 보증도 제공하지 않습니다. 무엇이 먼저 오는지. 그러나 문제가되는 모든 경우, 즉 최종 블록이 여전히 유용한 것을 할 수있는 경우 실행됩니다. –

+1

이 질문은 http://stackoverflow.com/questions/3484353/is-there-suchcase-when-in-try-finally-block-the-finally-wont-be-executed에서 보았습니다. Java 개발자는 웜홀/세계의 종말 등을 생각하지 않습니다. 나는 대답을 위해 – RBA

+0

이지만 Win64에는 없다는 것을 인정해야한다. 하지만 컴파일러에 의해 보장됩니까? –

답변

22

try..finally은 보호 된 블록에서 예외가 발생하더라도 finally 블록의 코드가 실행됨을 보장합니다. finally 블록이 실행되기 전에 프로세스가 종료 된 경우에는 물론 적용되지 않습니다. TerminateProcess 또는 전원을 끄십시오. 보호 된 블록의 무한 루프는 또한 finally 블록이 실행되는 것을 막을 수 있습니다.

+11

무한 루프의 경우 +1. –

+0

+1 또한 루프입니다. –

+15

관련 잡화는 마침내 모든 코드가 보장되는 것은 아닙니다. 예를 들어, finally 섹션에 3 개의 명령문을 넣을 수 있고 두 번째 명령문에서 불어 날 수 있습니다. 세 번째 명령문은 실행되지 않습니다. 좋은 예는 할당되지 않은 객체를 해제하려는 것입니다. –

4

전원이 차단 된 경우 (예 : 컴퓨터를 분리하고 배터리가없고 UPS에 연결되어 있지 않은 경우) finally 블록이 실행되지 않을 가능성이 높습니다. 주요 OS 또는 드라이버 오작동 (예 : BSOD)이 원인 일 수 있습니다. 그러나 try..finally 구조의 전체 아이디어는 try 블록 내에서 예외 (모든 종류의)가 발생하더라도 finally 블록이 실행된다는 것입니다. finally 블록은 블록 내에 exit 문이있는 경우 실행됩니다.

+0

+1이지만 델파이 개발자들은 유머 감각이 – RBA

+3

@RBA : 무엇, excatly? 컴파일러는 호스트 컴퓨터 (하드웨어/OS/드라이버)가 제대로 작동 함을 보장 할 수 없습니다. 그러나 * 평소에는'finally' 블록이 실행되도록 '보장'되어 있다고 믿습니다 * ESomeException.Create (...)'은'try' (블랙홀 등으로 컴퓨터가 빨려 들어가는 것처럼 다른 일은 일어나지 않습니다.) 안에 있습니다. –

+2

+1. 나는 '블랙홀'심판에 +1을 더 주겠다. 내가 할 수 있으면. :) –

3

앱에서 DEP (데이터 실행 방지) 예외가 발생하는 경우 Windows에서 계속 진행할 수 있다고 생각하지 않습니다. finally 섹션을 실행하지 않고 프로세스가 중단됩니다. 귀하의 프로세스가 "사라집니다". 그러나 이것은 컴파일러가 수행했거나하지 않은 것과는 아무런 관련이 없습니다.

1

try/finally가 입력되면 finally 블록은 실행이 try/finally를 떠나기 전에 실행됩니다.

+0

finally 블록이 _start_ 실행됩니다. 그냥 블록 안쪽에 아무것도 던지지 않기를 바랍니다. –

+0

@ finallyk 누가 finally 블록에 던져 넣는 코드를 작성합니까? –

+0

맥주를 모두 사시겠습니까? –