Đầu tiên hết, thành ngữ duy nhất mà thậm chí có thể được coi là một ứng cử viên là thế này:
try {
// stuff
} catch (Throwable t) { /* handle */ }
// finally stuff
Note loại bắt. Chỉ khi bạn bắt bất kỳ ngoại lệ nào có thể, bao gồm những quái vật tối tăm như ThreadDeath
và VirtualMachineError
, bạn có thể hy vọng vô điều kiện tiếp cận mã dưới sự cố gắng này.
Nhưng, đó chỉ là nơi bắt đầu. Điều gì sẽ xảy ra nếu mã xử lý tự ném một ngoại lệ? Vì vậy, bạn cần ít nhất
try { /* main stuff */ }
catch (Throwable t) {
try { /* handle */ } catch (Throwable t) {
// no code allowed here! Otherwise we descend into infinite recursion
}
}
/* finally stuff */
Bây giờ bạn có thể bắt đầu nhận ra lợi ích của finally
, nhưng đó không phải là tất cả. Hãy xem xét một trường hợp khá điển hình:
try {
/* main stuff, may throw an exception. I want the exception to
break what I'm doing here and propagate to the caller */
return true;
} finally { /* clean up, even if about to propagate the exception */ }
Làm cách nào để bạn viết lại? Nếu không có mã trùng lặp, không thể.
Nguồn
2013-06-23 15:28:52
Bạn có thể thêm logic để đóng tài nguyên trong câu lệnh chặn 'cuối cùng' và nhận ngoại lệ tại đây, do đó, phương án thay thế tốt nhất sẽ là sau (IMO). –
không có sự khác biệt trong ví dụ của bạn. Làm một số dọn dẹp trong cuối cùng mà sẽ được thực hiện anyway. – Tala