Trong khi duyệt System.Zip (Delphi XE2) để xem làm thế nào nó hoạt động, tôi thấy chức năng này:`at ReturnAddress` có nghĩa là gì trong Delphi?
procedure VerifyWrite(Stream: TStream; var Buffer; Count: Integer);
begin
if Stream.Write(Buffer, Count) <> Count then
raise EZipException.CreateRes(@SZipErrorWrite) at ReturnAddress;
end;
Đó là một phần at ReturnAddress
rằng loại câu đố tôi.
Tôi không biết rằng at
là từ khóa hợp lệ (công cụ đánh dấu cú pháp dường như không nhận ra được).
Theo IDE, nó được khai báo là System.ReturnAddress
, nhưng tôi chỉ có thể tìm thấy nó được khai báo dưới dạng nhãn ở đâu đó trong mã (asm) của procedure _HandleAnyException;
. Đơn vị hệ thống có đầy đủ các tham chiếu đến nó.
Vì vậy, những gì tôi muốn biết đây là:
ReturnAddress
là gì?- Chính xác thì
Raise Exception.Create ... at ReturnAddress
làm gì?
Điểm thưởng nếu bạn có thể đưa ra ví dụ thực tế về nơi đây sẽ là cấu trúc hữu ích hoặc nếu bạn có thể khuyên bạn không nên sử dụng nó.
@ain: Cảm ơn bạn đã hỗ trợ định dạng. Không có nghĩa là xóa sự thật bạn đã chỉnh sửa - chỉ muốn nhấn mạnh câu cuối cùng của văn bản được trích dẫn. :) –
Và việc sử dụng thế giới thực cho cấu trúc này nói chung là nếu bạn sử dụng một hàm trợ giúp * để tăng ngoại lệ. Trong VCL, ví dụ, có 'TList.Error', trong đó tất cả các lỗi liên quan đến' TList' đến từ đó. Biết một ngoại lệ được nâng lên trong hàm đó không hữu ích cho việc gỡ lỗi, do đó, nó sử dụng cú pháp 'at' để đặt lại địa chỉ ngoại lệ trong hàm gọi là' Lỗi', vì vậy khi bạn tìm địa chỉ trong tệp bản đồ của mình, bạn có một ý tưởng tốt hơn là thủ phạm. (Và tại sao lại sử dụng một helper? Đối với một, nó giữ codegen của người gọi đơn giản hơn.) –
@RobKennedy: Sẽ không phải là ngăn xếp cuộc gọi tiết lộ cùng một thông tin? – afrazier