예외 메시지를 기록하고 다른 예외를 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.