Nó vẫn là một antipotype nếu chúng ta đăng nhập một thông báo ngoại lệ và đưa ra một ngoại lệ khác?


18

Ứng dụng web của chúng tôi đang sử dụng một ExceptionMapperđể ánh xạ một số ngoại lệ Response. Chúng tôi ghi nhật ký các thông báo ngoại lệ trước khi đưa ra một ngoại lệ mới như sau:

catch (SomeException ex) {
  LOG.error(ex.getMessage());
  throw new MyException(ex.getMessage());
}

Chúng tôi sẽ không ném lại ngoại lệ tương tự , vì vậy câu hỏi của tôi là liệu đây có được coi là một antipotype Log và Ném không . Và do đó, sẽ tốt hơn nếu xóa nhật ký ở những nơi tương tự và di chuyển chúng đến một số ExceptionMapperlớp như sau:

@Provider
public class MyExceptionMapper implements ExceptionMapper<MyException> {

  // bla bla 

  @Override
  public Response toResponse(final MyException ex) {
    LOG.error(ex.getMessage());
    return Response.status(400).entity("something").build();
  }
}

3
Tôi sẽ dừng bạn ngay khi bạn đăng nhập ex.getMessage(), điều đó đã sai.
biziclop



IMO thật sự không công bằng khi không đề cập đến tất cả rằng đây là một dịch vụ web. Điều đó thực sự làm thay đổi các quy tắc trò chơi, vì ví dụ chỉ sử dụng cơ chế xử lý ngoại lệ thông thường có thể là một rủi ro bảo mật; bạn không muốn bất kỳ và tất cả ngoại lệ chỉ được gửi lại trong phản hồi lỗi 500, cần phải được kiểm tra và lọc. Ghi nhật ký tại chỗ tích cực cũng phổ biến hơn nhiều khi xử lý các hệ thống có máy khách bên ngoài trực tiếp gọi nó. Ghi nhật ký stacktraces trong các cuộc gọi dịch vụ được gọi liên tục có thể dẫn đến kích thước tệp nhật ký không thể quản lý và các vấn đề về hiệu suất.

@Gimby Trong trường hợp này, OP không gửi bất kỳ chi tiết lỗi nào trong phản hồi (có thể là nội dung "lỗi xảy ra"). Ngoài ra, làm thế nào để bạn chẩn đoán một vấn đề mà không có stacktrace? Các logger thường xuyên chăm sóc kích thước lưu trữ và dữ liệu nhật ký có thể nén được.
Marko Topolnik

Câu trả lời:


36

Mã của bạn thực sự thể thao không phải một, mà là ba antipotype:

  1. đăng nhập và suy nghĩ lại;
  2. suy nghĩ lại mà không gói nguyên nhân ban đầu;
  3. chỉ đăng nhập tin nhắn chứ không phải stacktrace (đây là tin xấu nhất).

Nếu bạn làm theo cách thực hành tốt nhất để:

  1. không bắt được gì cả (hãy để ngoại lệ tự lan truyền);
  2. nếu buộc phải bắt một ngoại lệ được kiểm tra, bọc vào không được kiểm tra và suy nghĩ lại;
  3. không bao giờ đăng nhập bất cứ điều gì ngoại trừ ở cấp cao nhất;
  4. đăng nhập toàn bộ stacktrace ngoại lệ với log.error("Error occurred", e);

sau đó bạn sẽ không phải đối mặt với bất kỳ tình huống khó xử nào, kể cả vấn đề hiện tại của bạn, bởi vì ngăn xếp được ghi lại cũng sẽ bao gồm tất cả các ngoại lệ được bao bọc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.