2010-04-10 34 views

Trả lời

130

Điều này rất hữu ích nếu bạn muốn phương pháp thực thi hiện tại vẫn ném ngoại lệ trong khi cho phép các tài nguyên được dọn dẹp một cách thích hợp. Dưới đây là một ví dụ cụ thể về việc xử lý ngoại lệ từ một phương thức gọi.

public void yourOtherMethod() { 
    try { 
     yourMethod(); 
    } catch (YourException ex) { 
     // handle exception 
    } 
}  

public void yourMethod() throws YourException { 
    try { 
     db.store(mydata); 
    } finally { 
     db.cleanup(); 
    } 
} 
+10

thường được sử dụng với các khóa như: lock.lock(); thử {/ * locked * /} cuối cùng {lock.unlock()} – mins

60

Có bởi vì người lập trình muốn đảm bảo rằng db.cleanup() được gọi ngay cả khi mã bên trong khối thử ném một ngoại lệ. Bất kỳ ngoại lệ nào sẽ không được xử lý bởi khối đó, nhưng chúng sẽ chỉ được truyền lên sau khi khối cuối cùng được thực thi.

+15

+1 Chính xác. 'Thử' chỉ ở đó để cho phép' cuối cùng'. Ngoại lệ không bị bắt. – zockman

+0

@zockman Nhận xét của bạn đóng đinh nó. –

+1

+1 để làm rõ rằng ngoại lệ tiếp tục tăng lên cho đến khi nó bị bắt. Cảm ơn –

18

Tại sao mã này thực hiện theo cách này?

Vì rõ ràng mã không biết cách xử lý ngoại lệ ở cấp này. Điều đó là tốt đẹp - miễn là một trong những người gọi thực hiện, nghĩa là miễn là trường hợp ngoại lệ cuối cùng được xử lý ở đâu đó.

Thông thường, mã cấp thấp không thể phản ứng phù hợp với ngoại lệ vì người dùng cần được thông báo hoặc ngoại lệ phải được đăng nhập hoặc một chiến lược khác phải được thử. Mã cấp thấp thực hiện chỉ một chức năng và không biết về việc ra quyết định cấp cao hơn.

Nhưng mã vẫn cần để làm sạch các nguồn lực (vì nếu không, họ sẽ bị rò rỉ), vì vậy nó không chỉ là trong mệnh đề finally, đảm bảo rằng nó luôn xảy ra, cho dù là một ngoại lệ ném hay không.

2

Khối cuối cùng đảm bảo rằng ngay cả khi một RuntimeException được ném (có thể do một số lỗi trong mã được gọi), cuộc gọi db.cleanup() sẽ được thực hiện.

này cũng thường được sử dụng để ngăn chặn quá nhiều làm tổ:

try 
{ 
    if (foo) return false; 
    //bla ... 
    return true; 
} 
finally 
{ 
    //clean up 
} 

Đặc biệt là khi có rất nhiều điểm mà tại đó trở về phương pháp, điều này cải thiện khả năng đọc như bất cứ ai có thể xem mã sạch lên được gọi là trong mọi trường hợp .

0

Mã đang thực hiện để đảm bảo rằng cơ sở dữ liệu bị đóng.
Thông thường, cách bạn sẽ làm là đặt tất cả mã truy cập cơ sở dữ liệu vào khối thử và sau đó thực hiện cuộc gọi để đóng cơ sở dữ liệu trong khối cuối cùng.
Cách thử ... cuối cùng hoạt động, có nghĩa là mã trong khối thử đang chạy, và mã trong khối cuối cùng được chạy khi kết thúc ... không có vấn đề gì.
Ngắn của máy tính bị kéo ra khỏi tường, cuối cùng sẽ thực thi.
Điều này có nghĩa rằng ngay cả khi một ngoại lệ được gọi, và phương pháp mất ba năm để thực thi, nó vẫn sẽ đi vào khối cuối cùng và cơ sở dữ liệu sẽ được đóng lại.

0

Nếu bất kỳ mã nào trong khối thử có thể ném ngoại lệ đã kiểm tra, nó phải xuất hiện trong mệnh đề ném của chữ ký phương thức. Nếu một ngoại lệ không được kiểm soát được ném, nó sẽ bị loại ra khỏi phương thức.

Khối cuối cùng luôn được thực hiện, cho dù có ngoại lệ hay không.

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