2011-12-23 67 views
17

終於會阻止執行?如果我通過出口; ?Finally塊中的語句是否仍然在這段代碼中執行?

procedure someProc; 
begin 
    Try 
     Exit; 
    finally 
    do_something; 
    end; 
end; 
+2

附註:'while true do try Exit; 終於 繼續; end;'不會編譯 - 請參閱[在Delphi和Java中使用無限循環的樂趣](http://mikejustin.wordpress.com/2008/07/13/fun-with-infinite-loops-in-delphi-and- java /) – mjn

回答

24

是,finally塊總是執行,即使你叫Exit地方。如果他們不是總是執行,他們將不值得。

10

一個快速測試應用程序可以很快回答這個問題。

program TestFinally; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

begin 
    try 
    WriteLn('Before exiting'); 
    Exit; 
    finally 
    WriteLine('In finally. If you see this, it was written after "Exit" was called'); 
    ReadLn; 
    end; 
end. 
21

finally子句將總是被執行,除非正在執行的線程進入非終止循環,塊無限期或異常終止,而執行該try子句。

相關documentation國家(重點煤礦):

一個try ... finally語句的語法是

try 
    statementList1 
finally 
    statementList2 
end 

其中每個語句列表是由分號分隔語句 的序列。

try ... finally語句在statementList1(try子句)中執行語句 。如果statementList1完成而不引發異常,則執行statementList2(finally子句)。如果在執行statementList1期間發生異常,則將控制轉移到statementList2;一旦statementList2 完成執行,異常將被重新提出。 如果呼叫 退出,中斷或繼續過程導致控制離開 statementList1,則會自動執行statementList2。 因此無論try子句如何終止,finally子句總是被執行。

+0

+1,用於列出當finally子句未執行時的條件。 –

+0

您錯過了'Halt'。 –

+0

@MrLister不,我沒有。再讀第一段。 –

6

爲了完整起見 - 最後塊,如果進程或線程執行try..finally塊端接了TerminateProcess/TerminateThread將執行。

例如,finally代碼塊不會在下面的代碼中執行。

o := TObject.Create; 
try 
    TerminateThread(GetCurrentThread, 0); 
finally 
    o.Free; 
end; 
+0

我在答覆中錯過了嗎?也許我應該說終止線程異常而不是程序。 –

+0

你說得對,你說的。隨意合併我的例子在你的答案,然後我會刪除我的。 – gabr

+2

我編輯了我的文字,使其更加完整。您的回答涵蓋了深入的特定方面,我認爲將您的示例合併到我的答案中會降低文檔引用的要點。感謝和+1。 –

相關問題