終於會阻止執行?如果我通過出口; ?Finally塊中的語句是否仍然在這段代碼中執行?
procedure someProc;
begin
Try
Exit;
finally
do_something;
end;
end;
終於會阻止執行?如果我通過出口; ?Finally塊中的語句是否仍然在這段代碼中執行?
procedure someProc;
begin
Try
Exit;
finally
do_something;
end;
end;
是,finally
塊總是執行,即使你叫Exit
地方。如果他們不是總是執行,他們將不值得。
一個快速測試應用程序可以很快回答這個問題。
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.
finally子句將總是被執行,除非正在執行的線程進入非終止循環,塊無限期或異常終止,而執行該try子句。
相關documentation國家(重點煤礦):
一個try ... finally語句的語法是
try statementList1 finally statementList2 end
其中每個語句列表是由分號分隔語句 的序列。
try ... finally語句在statementList1(try子句)中執行語句 。如果statementList1完成而不引發異常,則執行statementList2(finally子句)。如果在執行statementList1期間發生異常,則將控制轉移到statementList2;一旦statementList2 完成執行,異常將被重新提出。 如果呼叫 退出,中斷或繼續過程導致控制離開 statementList1,則會自動執行statementList2。 因此無論try子句如何終止,finally子句總是被執行。
+1,用於列出當finally子句未執行時的條件。 –
您錯過了'Halt'。 –
@MrLister不,我沒有。再讀第一段。 –
爲了完整起見 - 最後塊,如果進程或線程執行try..finally塊端接了TerminateProcess/TerminateThread將不執行。
例如,finally代碼塊不會在下面的代碼中執行。
o := TObject.Create;
try
TerminateThread(GetCurrentThread, 0);
finally
o.Free;
end;
我在答覆中錯過了嗎?也許我應該說終止線程異常而不是程序。 –
你說得對,你說的。隨意合併我的例子在你的答案,然後我會刪除我的。 – gabr
我編輯了我的文字,使其更加完整。您的回答涵蓋了深入的特定方面,我認爲將您的示例合併到我的答案中會降低文檔引用的要點。感謝和+1。 –
附註:'while true do try Exit; 終於 繼續; end;'不會編譯 - 請參閱[在Delphi和Java中使用無限循環的樂趣](http://mikejustin.wordpress.com/2008/07/13/fun-with-infinite-loops-in-delphi-and- java /) – mjn