Ngoại lệ chỉ nên là .. ngoại lệ. Thực hành tốt nhất khi sử dụng các ngoại lệ là sử dụng chúng để bao quát tình huống trong đó điều gì đó trái ngược với những gì bạn sẽ xảy ra. Ví dụ kinh điển là FileNotFoundException sẽ bị ném khi một tệp đơn giản là không có ở đó. Nếu bạn đang kiểm tra sự tồn tại của tệp, thì bạn sử dụng File.exists () vì bạn chỉ đơn giản là dùng một cây gậy 10 chân để xem bạn có đánh thứ gì không.
Về mặt kỹ thuật, bạn có thể hoàn thành các kết quả tương tự bằng cách bao quanh nó trong một lần thử và sử dụng tệp như thể nó tồn tại, nhưng các ngoại lệ A) thường tốn kém về tài nguyên và các lập trình viên sẽ cho rằng bạn có nghĩa là tệp tồn tại nếu nó tồn tại trong một thử bắt, làm tăng thêm sự nhầm lẫn chung của một chương trình.
Có nhiều tình huống trong đó tôi sẽ viết một phương thức lấy một số giá trị từ cơ sở dữ liệu. Một ngàn điều có thể sai, và xem làm thế nào tôi chỉ cần một mẩu thông tin nhỏ, thật bất tiện khi bao quanh cuộc gọi với một danh sách thử bắt có 5 trường hợp ngoại lệ khác nhau. Vì vậy, tôi sẽ bắt ngoại lệ trong phương thức tìm nạp. Nếu có lỗi xảy ra, tôi thực hiện bất kỳ hành động thích hợp nào để đóng kết nối cơ sở dữ liệu hoặc không có gì trong mệnh đề cuối cùng và trả về null. Đây là cách thực hành tốt không chỉ vì nó đơn giản hóa mã của bạn mà còn bởi vì "null" gửi cùng một thông điệp mà bạn có thể nhận được từ một ngoại lệ .. rằng một cái gì đó đã không đi theo kế hoạch. Quản lý các chi tiết cụ thể ngoại lệ trong phương thức tìm nạp, nhưng quản lý những việc cần làm khi mọi thứ không '
Ví dụ:
Integer getUserCount() {
Integer result = null;
try {
// Attempt to open database and retrieve data
} catch (TimeoutException e) {
logger.error("Got a watch?");
} catch (MissingDatabaseException e) {
logger.error("What are you smoking?");
} catch (PermissionsToReadException e) {
logger.error("Did you *really* think you were getting away with that?");
} catch (PressedSendButtonToHardException e) {
logger.error("Seriously.. just back away from the computer... slowly..");
} catch (WTFException e) {
logger.error("You're on your own with this one.. I don't even know what happened..");
} finally {
// Close connections and whatnot
}
return result;
}
void doStuff() {
Integer result = getUserCount();
if(result != null) {
// Went as planned..
}
}