2012-12-11 3 views
4

catch 블록에서 예외를 throw하여 메시지를 기록하면 예외의 원인이 무엇인지 확신 할 수 있습니까?catch 블록에서 예외를 다시 throw하는 것이 맞습니까?

코드이 방법에 유래 예외, 단지 그 오류를 표시 log.info의 여기에 실제 구현을 던질 것이라고 아래의 코멘트 하나에 대응

public void saveLogs(Logs logs) throws RemoteException 
    { 
     try 
     { 
      LogsOps.saveLogs(logs); 
     } 
     catch (RemoteException e) 
     { 
      log.info("RemoteException is thrown while trying to save logs ", e); 
      throw new RemoteException("RemoteException caused while trying to save", e); 
     } 
    } 

.

 /** Log the message and the exception with a level of INFO. 
    * @param message - The message text. 
    * @param t - An exception to display. 
    */ 
    public void info(Object message, Throwable t) 
    { 
     String nullSafeMessage = (message != null) ? message.toString() : t.getClass().getSimpleName(); 
     log.info(nullSafeMessage, t); 
    } 

따라서 Stackoverflow 예외가 발생하지 않습니다.

+0

stacktrace에 원점이 포함되지 않았습니까?이 문제를 피하려면 가능한 한 설명적인 메시지 여야합니다. 그러나 나는 거의 끝나지 않았다. 다른 어떤 것도 기록하지 않는 한. – jn1kk

+0

실제로 로깅에 예외가 발생했습니다. 그 StackOverFlow 예외 것입니다! – Mukus

+0

@TejaswiRana : StackOverFlow 예외를 던지는 것을 보지 못했습니다. Stack Over Flow 예외가 발생하는 이유는 무엇입니까?, 업데이트 된 질문을 참조하십시오. – Rachel

답변

9

더 높은 예외를 잡으려는 대상에 따라 다릅니다.이 메시지를 기록하는 것입니다 아무것도 경우, 확실히, 그것은 의미가 - 아마 대신 새로운 하나를 만드는 원래 예외를 다시 던지는 것 있지만 :

catch (RemoteException e) 
{ 
    log.info("RemoteException is thrown while trying to save logs ", e); 
    throw e; 
} 

이상적으로,하지만 당신 ' d는 catch 블럭을 스택 위로 올리면 올바르게 로깅됩니다. 인 경우에만이 예외를 로깅하면 어쨌든 모든 정보를 얻을 수 있습니다. 그것은 메이크업 감각/잡을 수는 는 매개 변수 값으로 예외 존재하지 않습니다 정보를 기록 할 때 다시 throw/로그

.

+0

동의하지만, 제 경우에는 예외 로그를 ​​일반 로그 메시지로 캡쳐하고 있지만 현재 RemoteException이 throw 된 이유와 이유에 대한 특정 메시지를 캡처하여 일부가있을 때 응용 프로그램의 관점을 디버깅하는 것이 더 쉬울 수 있습니다. 문제가 있습니다. – Rachel

+0

@Rachel 내가 아는 망할 로거는 메소드 이름과 클래스 이름을 출력하므로 특정 정보가 필요하지 않습니다. 또한 메시지를 출력하고 계속 진행하기를 원하면'Exception.getMesssage'를 사용할 수 있습니다. –

3

결국 전파되는 예외를 처리한다고 가정하면 catch-log-rethrow의이 전략은 로그 파일을 혼란스럽게합니다. 이것이 스택 트레이스 전체에서 수행되었다고 상상해보십시오 - 유용하지 않은 여분의 오류 정보가 쌓여 버립니다.

예외를 처리하지 않으면 기록하지 말아야합니다.

0

로깅 외에도이 방법을 사용하면 장애가 발생할 경우 필요한 정리를 수행하여 호출자에게 제어권을 반환하여 스택 위로 이동할 수 있습니다. 경우 위에서 보여줍니다으로 항상은 아니지만, - 예를

InputStream is = new InputStream(...) 

try { 

    is.read(...); 

    return is; 

} catch (IOException ioe) { 
    is.close(); 
    throw ioe; 
} 

이것은 물론, 다소 특별한 사용이 finally 절을 사용하여 우아하게 대부분의 시간을 피할 수있다 들어

.

관련 문제