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;
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;
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.
Ứ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.
Đ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.
+1 để liệt kê các điều kiện đó khi mệnh đề cuối cùng không được thực hiện. –
Bạn đã bỏ lỡ 'Halt'. –
@MrLister Không, tôi không có. Đọc lại đoạn đầu tiên. –
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;
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. –
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
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. –
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