2011-12-23 30 views
17

Cuối cùng sẽ chặn thực thi? nếu tôi vượt qua lối ra; ?Các câu lệnh trong khối Cuối cùng vẫn thực hiện trong đoạn mã này?

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

Lưu ý bên: 'while True do try Exit; cuối cùng là Tiếp tục; kết thúc; 'sẽ không biên dịch - xem [Fun với Vòng lặp vô hạn trong Delphi và Java] (http://mikejustin.wordpress.com/2008/07/13/fun-with-infinite-loops-in-delphi-and- java /) – mjn

Trả lời

24

Có, finally khối luôn thực thi, ngay cả khi bạn gọi Exit ở đâu đó. Họ sẽ không có giá trị nhiều nếu họ không luôn thực hiện.

10

Ứng dụng thử nghiệm nhanh có thể trả lời câu hỏi này rất nhanh.

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

Điều khoản cuối cùng sẽ luôn được thực hiện, trừ khi chuỗi thực hiện nhập vào vòng lặp không kết thúc, chặn vô thời hạn hoặc bị ngắt bất thường trong khi thực thi mệnh đề try.

Các thích hợp documentation bang (tôi nhấn mạnh):

Cú pháp của thử ... một cuối cùng tuyên bố là

try 
    statementList1 
finally 
    statementList2 
end 

nơi mỗi statementList là một chuỗi các câu lệnh giới hạn bởi dấu chấm phẩy.

Câu lệnh try ... cuối cùng thực thi các câu lệnh trong statementList1 (mệnh đề try). Nếu statementList1 kết thúc mà không tăng ngoại lệ, thì statementList2 (mệnh đề cuối cùng) được thực hiện. Nếu một ngoại lệ được nâng lên trong quá trình thực thi câu lệnh statementList1, được chuyển tới statementList2; khi statementList2 kết thúc thực hiện, ngoại lệ sẽ được nâng lên. Nếu một cuộc gọi đến Quy trình thoát, ngắt hoặc tiếp tục khiến kiểm soát để lại statementList1, statementList2 được thực thi tự động. Vì vậy, mệnh đề cuối cùng luôn được thực hiện, bất kể mệnh đề try kết thúc như thế nào.

+0

+1 để liệt kê các điều kiện đó khi mệnh đề cuối cùng không được thực hiện. –

+0

Bạn đã bỏ lỡ 'Halt'. –

+0

@MrLister Không, tôi không có. Đọc lại đoạn đầu tiên. –

6

Vì lợi ích của sự hoàn chỉnh - khối finally sẽ không thực hiện nếu quá trình hay một chủ đề thực hiện các khối try..finally bị chấm dứt với TerminateProcess/TerminateThread.

Ví dụ: chặn cuối cùng sẽ không được thực hiện trong mã bên dưới.

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

Tôi có bỏ lỡ điều đó trong câu trả lời của tôi không? Có lẽ tôi nên nói rằng chấm dứt * thread * bất thường thay vì chương trình. –

+0

Bạn nói đúng, bạn nói vậy. Hãy kết hợp ví dụ của tôi trong câu trả lời của bạn, sau đó tôi sẽ xóa của tôi. – gabr

+2

Tôi đã chỉnh sửa văn bản của mình để hoàn thiện hơn một chút. Câu trả lời của bạn bao hàm khía cạnh cụ thể đó và tôi cho rằng việc kết hợp ví dụ của bạn vào câu trả lời sẽ làm giảm điểm chính là báo giá tài liệu. Cảm ơn và +1. –

Các vấn đề liên quan