2012-03-13 29 views
24

Tôi nên ném ngoại lệ nào khi phương thức nhà máy tĩnh không khởi tạo được đối tượng mới? Tôi thích đưa ra một ngoại lệ có ý nghĩa hơn là trả lại null.Java: Ngoại lệ thích hợp cho lỗi khởi tạo

+1

Điều đó phụ thuộc vào nguyên nhân gây ra lỗi, ví dụ: sự cố mạng, lỗi đọc tệp, v.v. – Viruzzo

+0

Bạn có nghĩa là tôi chỉ nên ném bất kỳ ngoại lệ nào mà tôi nhận được trong quá trình khởi tạo? –

+0

Không nhất thiết, nhưng ngoại lệ của bạn nên có ý nghĩa trong việc cho biết điều gì đã xảy ra, không chỉ là điều gì đó * đã xảy ra. – Viruzzo

Trả lời

28

Nếu bạn đang ném ngoại lệ trong Nhà máy do không đủ dữ liệu, tôi muốn ném một số IllegalStateException với mô tả tương tự như "không thể xây dựng X, không có Y nào được đặt".

Nếu bạn đang ném ngoại lệ trong Nhà máy do dữ liệu xung đột, tôi muốn ném IllegalStateException với mô tả tương tự "không thể xây dựng xung đột X, Y với Z".

Nếu bạn đang ném ngoại lệ trong Nhà máy do giá trị xấu (hoặc vô nghĩa), tôi muốn ném một IllegalArgumentException với mô tả tương tự như "Y không thể là A".

Nếu bạn đang ném một ngoại lệ trong Nhà máy do thiếu giá trị, tôi muốn ném một IllegalArgumentException với mô tả tương tự như "Y không thể rỗng".

Tùy chọn cuối cùng tùy thuộc vào một số tranh luận. Một số người cho rằng tốt hơn là nên ném một NullPointerException; trong trường hợp của tôi, chúng tôi tránh chúng ở tất cả các chi phí vì nhiều khách hàng có xu hướng không đọc thông báo ngoại lệ (và giả định rằng NullPointerException có nghĩa là một lỗi mã hóa).

Trong mọi trường hợp, bạn nên cung cấp thông điệp tốt, cụ thể về lý do ngoại lệ được ném, để giảm chi phí hỗ trợ trong tương lai của bạn khi thấy ngoại lệ đó tăng lên vài tháng kể từ bây giờ.

2

Bạn có thể tạo ngoại lệ của riêng bạn bằng cách mở rộng lớp Exception

+0

Không có ngoại lệ tích hợp cho trường hợp này? Đó là một kịch bản khá phổ biến. –

+0

Tôi khó có thể gọi một nhà xây dựng ném một ngoại lệ là một trường hợp phổ biến – Woot4Moo

+0

Có rất nhiều ngoại lệ nhưng sẽ linh hoạt hơn nếu có thông điệp tùy chỉnh của riêng bạn nếu cần –

2

Something như thế này có lẽ chỉ nên là một Khẳng định, nhưng nếu có trong thực tế, khả năng này thất bại thì một ngoại lệ tùy chỉnh mà có ý nghĩa đối với bạn sẽ là sự lựa chọn của tôi.

1

Lý tưởng nhất là bạn muốn mở rộng Exception và tự tạo IntializatonException của riêng mình.

2

Vâng, nguyên nhân của sự cố là đặt cược tốt nhất của bạn. Nếu các đối số không OK, bạn có thể ném IllegalArgumentException, nếu một số tệp không có ở đó, bạn có thể ném FileNotFoundException, nếu nhà máy không được khởi tạo đúng cách, bạn có thể ném IllegalStateException, v.v ...

Tuy nhiên, việc tạo Ngoại lệ của riêng bạn thật dễ dàng. Chỉ cần khai báo lớp của bạn là extends Exception và thêm các hàm tạo ủy nhiệm. Nếu bạn mở rộng Ngoại lệ, thì phương thức có thể ném nó phải được khai báo với throws. Nếu bạn không muốn điều đó, bạn có thể mở rộng RuntimeException, những thứ đó không cần khai báo.

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