Giả sử tôi có đoạn mã sau:Làm thế nào để kết hợp khai thác gỗ với một chuỗi xử lý ngoại lệ?
void foo() {
/* ... */
try {
bar(param1);
} catch (MyException e) {
/* ??? */
}
}
void bar(Object param1) throws MyException {
/* ... */
try {
baz(param2);
} catch (MyException e) {
/* ??? */
}
}
void baz(Object param2) throws MyException {
/* ... */
if (itsAllATerribleMistakeOhNo) {
/* ??? */
throw new MyException("oops, error.");
}
}
Tôi đang tự hỏi ở đâu và làm thế nào tôi nên đăng nhập lỗi.
- Trường hợp xảy ra lỗi, bên dưới, trong baz(), tôi biết chính xác thao tác nào đã bị lỗi và có thể ghi lại sự thật đó.
- Ở trên cùng, tôi có ngữ cảnh chung nhất (ví dụ: IP của kết nối trong khi xử lý chúng tôi gặp phải lỗi này.)
- Trên đường đi, tôi có thể có một số ngữ cảnh không được biết ở trên cùng hoặc ở phía dưới.
Một biến chứng khác là lỗi ở phía dưới có thể không thực sự được coi là lỗi khi bạn nhìn vào nó từ trên cùng (ví dụ: tra cứu thứ gì đó trong cơ sở dữ liệu không thành công; có thể chọn logger.WARN()
thay vì logger.ERROR()
.
Vì vậy, ở trên tôi đã mô tả 3 vị trí (dưới cùng, trên cùng và trên đường đi) - nhưng nó không chỉ là câu hỏi về nơi đăng nhập, mà còn là những gì để ném lên. Ở mọi cấp độ ở giữa, bạn có các tùy chọn 2x2:
- Log/Không log nhắn
- Ném ngoại lệ ban đầu/quấn ngoại lệ trong một ngoại lệ mới với thông điệp nói thêm.
Thực tiễn tốt nhất hoặc một số sự khôn ngoan thông thường về những lựa chọn phức tạp này là gì?
Lưu ý: Tôi không hỏi về việc xử lý lỗi/sử dụng ngoại lệ nói chung, chỉ là về tình trạng khó xử được mô tả ở trên.
Giới thiệu về điểm của bạn 1: Bạn chỉ nên ghi nhật ký tại 1 điểm dọc theo chuỗi cuộc gọi. Bạn có thể giải thích tại sao bạn nghĩ điều này là tốt nhất? Về điểm 2: gói và sử dụng một cây phân lớp ngoại lệ là hai thứ khác nhau ... Về điểm 4: Điểm tốt nhưng không liên quan đến tình trạng khó xử của tôi. – einpoklum
Trong trường hợp của thông điệp dấu vết, truy tìm tại các điểm ngoại lệ xảy ra chứng tỏ hữu ích cho các nhà phát triển. Khi bạn cho biết chuỗi thêm vào lý do ngoại lệ. Sau đó, theo tôi, bạn nên tạo riêng biệt kiểm tra ngoại lệ để chính xác chỉ ra lý do. Nếu đó là một lỗi lập trình viên hoặc lập trình thì việc ném ngoại lệ thời gian chạy là tốt hơn. Ví dụ 'DBConnectivityNotAvailable' có thể được kiểm tra ngoại lệ. Bạn có thể đưa ra một ví dụ về trường hợp của bạn, nơi bạn đang bối rối? Tôi có nghĩa là nó phụ thuộc vào từng trường hợp để sử dụng chiến lược nào để khai thác gỗ. –
Mỏ là một trường hợp phức tạp của một số trường hợp ngoại lệ đã kiểm tra hiện tại và một số ngoại lệ thời gian chạy tiềm ẩn, hiện tại tôi có một khối chặn ở đầu chuỗi cuộc gọi và các thanh ghi thường xuyên dọc theo chuỗi. Ngoài ra còn có các vấn đề ERROR-vs-WARN, trong đó phần dưới cùng của chuỗi không thể biết liệu có cái gì đó là L ERI hay không. – einpoklum