예외 메시지를 기록하고 다른 예외를 throw하면 여전히 반 패턴입니까?


18

Google 웹 애플리케이션에서 ExceptionMapper일부 예외를에 매핑 하기 위해를 사용하고 Response있습니다. 다음과 같이 새 예외를 발생시키기 전에 예외 메시지를 기록합니다.

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

우리는 같은 예외를 다시 던지지 않기 때문에 이것이 Log and Throw 반 패턴 으로 간주되는지에 대한 질문입니다 . 따라서 비슷한 장소에서 로깅을 제거하고 ExceptionMapper다음과 같이 여러 클래스로 이동하는 것이 좋습니다 .

@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
당신이 로그인하자마자 당신을 멈출 ex.getMessage()것입니다. 그것은 이미 틀 렸습니다.
biziclop



IMO 이것이 웹 서비스라는 것을 전혀 언급하지 않는 것은 실제로 공평하지 않습니다. 예를 들어 규칙적인 예외 처리 메커니즘을 사용하는 것이 보안 상 위험 할 수 있기 때문에 실제로 게임 규칙이 변경됩니다. 500 오류 응답으로 모든 예외를 다시 보내지 않으려면 확인하고 필터링해야합니다. 외부 클라이언트가 직접 호출하는 시스템을 처리 할 때는 적극적인 현장 로깅도 훨씬 일반적입니다. 반복적으로 호출되는 서비스 호출에서 스택 추적을 기록하면 관리 할 수없는 로그 파일 크기 및 성능 문제가 발생할 수 있습니다.

@Gimby이 경우 OP는 응답에 오류 세부 정보를 보내지 않습니다 (아마도 상용구 "오류가 발생했습니다"내용). 또한 스택 추적없이 문제를 어떻게 진단합니까? 롤링 로거는 일상적으로 스토리지 크기를 관리하며 로그 데이터는 압축하기가 어렵습니다.
Marko Topolnik

답변:


36

실제로 코드는 하나가 아니라 세 가지 반 패턴을 사용합니다.

  1. 기록하고 다시 던지십시오.
  2. 원래 원인을 포장하지 않고 다시 던지십시오.
  3. 메시지 만 기록하고 스택 추적은 기록하지 않습니다 (이것이 최악입니다).

모범 사례를 따른 경우 :

  1. 전혀 포착하지 마십시오 (예외를 스스로 전파하십시오).
  2. 확인 된 예외를 잡아야하는 경우, 확인되지 않은 상태로 랩핑하고 다시 던지십시오.
  3. 최상위 레벨을 제외하고는 아무것도 기록하지 마십시오.
  4. 전체 예외 스택 추적을 기록하십시오. log.error("Error occurred", e);

기록 된 스택 추적에 래핑 된 예외도 모두 포함되므로 현재 딜레마를 포함하여 딜레마에 직면하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.