Trong ứng dụng của tôi, tôi đang chạy mã của tôi qua PMD.It chỉ cho tôi tin nhắn này:Tránh printStackTrace(); sử dụng một cuộc gọi logger thay
- Tránh printStackTrace(); sử dụng cuộc gọi nhật ký thay thế.
Điều đó có nghĩa là gì?
Trong ứng dụng của tôi, tôi đang chạy mã của tôi qua PMD.It chỉ cho tôi tin nhắn này:Tránh printStackTrace(); sử dụng một cuộc gọi logger thay
- Tránh printStackTrace(); sử dụng cuộc gọi nhật ký thay thế.
Điều đó có nghĩa là gì?
Nó có nghĩa là bạn nên sử dụng khung đăng nhập như logback hoặc log4j và thay vì ngoại lệ in ấn trực tiếp:
e.printStackTrace();
bạn nên đăng nhập chúng bằng API khuôn khổ này:
log.error("Ops!", e);
khung Logging cung cấp cho bạn rất linh hoạt, ví dụ bạn có thể chọn xem bạn có muốn đăng nhập vào bảng điều khiển hoặc tệp hay không hoặc có thể bỏ qua một số thư nếu bạn thấy chúng không còn liên quan trong một số môi trường nữa.
Nếu bạn gọi printStackTrace()
trên ngoại lệ, dấu vết được ghi đến System.err
và thật khó để định tuyến ở nơi khác (hoặc lọc bộ lọc). Thay vì thực hiện điều này, bạn được khuyến khích sử dụng khung đăng nhập (hoặc trình bao bọc xung quanh nhiều khung đăng nhập, như Apache Commons Logging) và ghi lại ngoại lệ bằng cách sử dụng khung công tác đó (ví dụ: logger.error("some exception message", e)
).
Làm điều đó cho phép bạn:
một sản xuất chương trình chất lượng nên sử dụng một trong những lựa chọn thay thế nhiều khai thác gỗ (ví dụ log4j, logback, java.util.logging) để báo cáo lỗi và chẩn đoán khác. Điều này có một số lợi thế:
Ngược lại, nếu bạn chỉ sử dụng printStackTrace, người triển khai/người dùng cuối có ít hoặc bất kỳ quyền kiểm soát và thông điệp ghi nào có thể bị mất hoặc hiển thị cho người dùng cuối trong những trường hợp không phù hợp.(Và không có gì đáng sợ một người dùng nhút nhát hơn một dấu vết ngăn xếp ngẫu nhiên.)
Hầu hết mọi khung đăng nhập đều cung cấp một phương thức để chúng ta có thể truyền đối tượng có thể ném cùng với một thông điệp. Giống như:
public trace(Marker marker, String msg, Throwable t);
Chúng in ngăn xếp của đối tượng có thể ném.
Trong đơn giản, e.printStackTrace() không tốt, vì nó chỉ in ra dấu vết ngăn xếp thành lỗi chuẩn. Bởi vì điều này bạn không thể thực sự kiểm soát nơi đầu ra này đi.
Chỉ cần nói cảm ơn ở đây để có phản hồi có giá trị ở nơi khác ;-) – GhostCat