Điều nào là tốt hơn tùy thuộc vào khả năng mã của bạn sắp bắt các ngoại lệ cụ thể. Nếu bạn chỉ có khả năng bắt (hoặc phân biệt đối xử theo một cách nào đó) thì ngoại lệ chung (superclass) hơn, sau đó có nhiều ngoại lệ (lớp con) cụ thể hơn không đạt được nhiều. Trong trường hợp đó, có lẽ tốt hơn nên xác định ít ngoại lệ hơn và sử dụng thông báo ngoại lệ để thể hiện chi tiết tốt hơn về những gì đã xảy ra.
Mặt khác, nếu ngoại lệ cụ thể đã tồn tại, bạn nên sử dụng chúng. Chỉ cần ném java.lang.Exception
hoặc java.lang.RuntimeException
là lười biếng, IMO.
THEO UP
Vâng, tôi đang đánh bắt ngoại lệ luôn luôn cụ thể, nhưng vấn đề là, trong "bắt" khác mà tôi sử dụng ngoại lệ cũng cụ thể là loại tương tự (họ có thể tham khảo " cơ sở dữ liệu "chẳng hạn, nhưng chúng không giống nhau). Vì vậy, câu hỏi đặt ra là nếu nó là một điều tốt để làm một "DatabaseException", và sử dụng nó, thay vì "DatabaseConnectionException" và "DatabaseDataException" chẳng hạn, có thể đọc được nhiều hơn, nhưng cuối cùng tôi có hàng triệu ngoại lệ rõ ràng.
Nếu mã của bạn thường xuyên trông như thế này:
try {
...
} catch (DatabaseConnectionException ex) {
// do something
} catch (DatabaseDataException ex) {
// do same thing
} catch (DatabaseTangoException ex) {
// do same thing
}
... thì ngoại lệ hạt mịn của bạn không được hỗ trợ. Nhưng nếu có vẻ như thế này:
try {
...
} catch (DatabaseConnectionException ex) {
// do something
} catch (DatabaseDataException ex) {
// do something completely different
} catch (DatabaseTangoException ex) {
// do something totally extraordinary
}
... thì có thể các ngoại lệ chi tiết của bạn đang hoạt động cho bạn. Và nếu bạn khai báo ba trường hợp ngoại lệ này là các lớp con của DatabaseDataException
, thì bạn có thể xử lý các trường hợp với nhau hoặc riêng rẽ khi các trường hợp ra lệnh.
Thực sự, bạn có thể tự mình đưa ra quyết định của mình, trong ngữ cảnh đơn đăng ký của bạn.
Related: http://stackoverflow.com/questions/3948418/why-always-declare-user-defined-exceptions-as-final – ShiDoiSi