2012-09-16 31 views
5

Có bất kỳ sự khác biệt thực tiễn giữa hai mô hình mã hóa trong Delphi:Sự khác biệt giữa việc gói một khối thử cuối cùng với khối thử-trừ và ngược lại là gì?

Version 1

try 
    try 
    {Do something} 
    finally 
    {Do tidy up} 
    end 
except 
    {Handle exception} 
end; 

Version 2

try 
    try 
    {Do something} 
    except 
    {Handle exception} 
    end 
finally 
    {Do tidy up} 
end; 
+5

Là một sang một bên, tôi đã tìm thấy một lỗi x64 khá đáng sợ liên quan đến các khối cuối cùng có nghĩa là chúng có thể được gọi hai lần! http://qc.embarcadero.com/wc/qcmain.aspx?d=108457 –

+0

Mã không hiển thị nơi tài nguyên được bảo vệ được cấp phát (SomeObject.Create). Có phải trong phần 'làm điều gì đó' hay sớm hơn không? – mjn

+0

Thật không may là các khối 'finally' và' except' đều được giới thiệu với cùng một từ khóa 'try' vì chúng là các khái niệm trực giao khác. –

Trả lời

6

Có hai khác biệt:

  1. Thứ tự tương đối trong đó ngoại trừ và cuối cùng khối thực thi khác nhau. Trong phiên bản 1, cuối cùng thực hiện trước khi ngoại trừ. Trong phiên bản 2, lệnh xử lý bị đảo ngược.
  2. Trong phiên bản 1, nếu khối cuối cùng tăng, thì nó sẽ được xử lý bởi khối ngoại trừ. Trong phiên bản 2, nếu khối cuối cùng tăng, thì nó sẽ được xử lý bởi trình xử lý ngoại lệ tiếp theo, tức là bên ngoài mã này.

Thông thường bạn không quan tâm đến các khối cuối cùng tăng lên. Bạn chỉ đơn giản là không mong đợi điều đó xảy ra và nếu có, một cái gì đó có lẽ rất bị hỏng.

Vì vậy, sự khác biệt được tính là liệu cuối cùng có chạy trước trình xử lý ngoại lệ hay ngược lại hay không. Đôi khi nó không quan trọng, nhưng nó thường tạo ra sự khác biệt.

2

Khi bạn sử dụng try..except các dòng dưới đây được thực thi.

Resource := TAbstractResource.Create; 
try 
    Resource.DoSomeThing; 
except 
    On E:Exception Do 
    HandleException(E); 
end; 
FreeAndNil(Resource); 
+0

Tôi không thể thấy cách điều này liên quan đến câu hỏi, hoặc thực sự là bất cứ điều gì. Hơn nữa, thực hành tốt nhất là sử dụng cuối cùng để bảo vệ tài nguyên và để các ngoại lệ nổi lên mã mức cao hơn. –

+1

Tôi nghĩ người trả lời có nghĩa là nếu bạn xử lý bất kỳ ngoại lệ nào trong khối 'except' bạn không cần khối' finally'. – kludg

+0

@Serg OK, điều đó sẽ có ý nghĩa. Tuy nhiên, tôi vẫn từ chối mã này nếu nó được đặt trước mặt tôi. Hãy thử/cuối cùng là làm thế nào để bảo vệ tài nguyên và khi tôi thấy thử/cuối cùng, tôi biết ý nghĩa của nó. Khi tôi không nhìn thấy nó tôi phải suy nghĩ. –

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