Nhìn qua Joshua Bloch Java hiệu quả - Second Edition ', tôi stumbled khi các mã sau vào trang 152:Đang tích cực ném AssertionError trong thực hành tốt Java?
double apply(double x, double y) {
switch(this) {
case PLUS: return x + y;
case MINUS: return x - y;
case TIMES: return x * y;
case DIVIDE: return x/y;
}
throw new AssertionError("Unknown op: " + this);
}
Bây giờ những gì confuses me là, rằng AssertionError
đang tích cực ném. Đó có phải là thực hành tốt không? Để xác nhận sự hiểu biết của tôi được sử dụng để không can thiệp vào mã như vậy khi lập trình java được khởi động mà không có xác nhận được bật và do đó các câu lệnh khẳng định không được thực thi, hành vi không thay đổi. Tôi sẽ khá bối rối, nếu tôi nhận được AssertionException
khi tôi chạy một chương trình mà thậm chí không bật xác nhận.
Mặc dù tôi hiểu rằng trường hợp mẫu có thể xảy ra khá thường xuyên, bạn phân tích một vài tùy chọn khác nhau và nếu không có tùy chọn nào khác, bạn nên ném ngoại lệ.
Vì vậy, thực hành tốt là ném một số AssertionException
vào đây, hoặc tốt hơn là nên ném một cái khác? Nếu vậy, cái nào sẽ phù hợp nhất? Có lẽ IllegalArgumentException
?
Chỉnh sửa để làm rõ: Câu hỏi của tôi không phải là về việc liệu chúng ta nên ném một Error
ở đây, nhưng nếu chúng ta muốn ném một Exception
hoặc một Error
, cái nào nó nên được? Và thực tiễn tốt là chủ động ném AssertionError
s? Tài liệu nói rằng Được cho là đã xác nhận rằng một xác nhận đã thất bại, vì vậy tôi có cảm giác rằng chúng ta không nên chủ động ném nó. Đúng không?
Second Chỉnh sửa: Xóa câu hỏi: Liệu nó tốt thực hành để chủ động ném một AssertionError
, hoặc là nên tránh, mặc dù nó có thể? (Tôi đoán đọc tài liệu là sau)
Nó khá dựa vào ý kiến. Về phần tôi, tôi ném 'AssertionError'. Tôi nghĩ lý do chính để không kiểm tra xác nhận trong sản xuất là chi phí kiểm tra xác nhận, và trong ví dụ trong câu hỏi tôi không nghĩ có một xác nhận. Tôi ở bên cạnh Bloch. –
Đó chắc chắn là Lỗi, không phải là Ngoại lệ. Không có kịch bản hợp lý nơi người ta nên cố gắng nắm bắt lỗi và tiếp tục thực hiện. –
Vì vậy, để trả lời câu hỏi tiêu đề từ những gì tôi hiểu từ các cuộc thảo luận ở đây: Có, nó là ok để chủ động ném một 'AssertionError' trong programm của bạn. Và nếu bạn làm như vậy, các xác nhận không cần phải được bật. –