2009-10-04 3 views
0

을 던져지는, 나는 코드 조각에서 발생되는 예외를 기록 할 :자바 : 로그 예외가 자바에서

try 
{ 
    doRiskyThing(); 
} 
catch(Throwable t) 
{ 
    log.warn("too bad"); 
    throw t; 
} 

문제는 지금 내 방법이 던질 수 던져 선언해야한다는 것입니다.

반면에 finally 블록에 예외를 기록하면 예외가 throw되는 것을 어떻게 알 수 있습니까? 예외가 전혀 발생하지 않습니다.

답변

4

적어도 체크 된 예외에 대해서는 체크되지 않은 블록과 n 개의 catch 블록에 대한 catch를 작성할 수 있습니다.

try{ 
    .. 
}catch(RuntimeException e){ 
    log(e); 
    throw e; 
}catch(ExceptionException ..){ 
    log(e); 
    throw e; 
} 

이 방법의 서명은 변경되지 않습니다. 잡기 오류는 약간의 냄새입니다. 글쎄, 로깅과 던지는 예외도 냄새입니다. 오류 메시지가 중복됩니다.

사전 예외 처리는 이미 나쁜 관행 (많은 코드 품질 검사 도구와 같은 플래그) 그 자체에서의 Throwable 잡기 JDK 7

0

이것은 예외를 기록하는 잘못된 장소 인 것처럼 보입니다. 던질 때 doRiskyThing() 내에서 기록하거나 캡처해야하는 위치에 기록하십시오.

try 
{ 
    doRiskyThing(); 
} 
catch(RuntimeException e) 
{ 
    log.warn("too bad"); 
    throw e; 
} 
catch(Exception e) 
{ 
    log.warn("too bad"); 
    throw new RuntimeException(e); 
} 
catch(Error e) 
{ 
    log.warn("too bad"); 
    throw e; 
} 

을하지만 추한 내가 오히려 더 다시 던지고, 응용 프로그램의 최상위 수준에있는 모든 및 로그를 잡는다 하나의 catch 블록이있을 것이다 :

0

이 작동합니다. 어쨌든 스택 추적을 통해 문제를 정확히 찾아 낼 수 있습니다.

-1

Throwable을 로그하고 RuntimeException을 throw 할 수 있습니다.

Java에서는 메서드의 서명 중 일부로 간주되기 때문에 메서드 자체에서 throw되는 예외를 선언해야합니다. 즉 해당 규칙을 피하는 RuntimeException을 제외하고는 예외입니다. 원한다면 RuntimeException은 메시지의 일부로 Throwable의 메시지를 제공 할 수 있습니다.

try 
{ 
    doRiskyThing(); 
} 
catch(Throwable t) 
{ 
    log.warn("too bad, exception thrown: " + t.getMessage()); 
    throw new RuntimeException("Throwable exception was thrown, message: " + t.getMessage()); 
} 

이 나쁜 관행으로 간주 될 수 있으며, 더 장기 코드가가 아닌 런타임 예외를 발생 및 방법의 서명에 정의하는 것이 좋습니다 것을 그러나 조심하십시오.

+0

"나쁜 습관"에 대해서는 사실 확인되지 않은 ("런타임") 예외를 선호하여 확인 된 예외에서 벗어나는 경향이 있으며 메소드 서명에 런타임 예외를 정의 할 수 있습니다. – SingleShot

+0

@SS 이것이 정말로 나쁜 생각 인 이유 중 하나는 RuntimeException을 래핑하는 것이 전파되는 예외를 변경하는 것이다. 이로 인해 예외를 처리하기 위해 스택을 낮추는 것이 어렵습니다. –

0

에서 프로젝트 동전에서 제거 된 기능입니다. 그것을 RuntimeException에 래핑하고 그것을 다시 던지기? 무서운! 예외 계층 구조를 갖는 전체 요점은 이것에 의해 손상됩니다.

확인 된 예외에서 벗어난 '추세'는 실제로 조금 더 미묘합니다. 아키텍처 레이어 (예를 들어 프레임 워크 API 경계) 사이에는 하나 이상의 의미있는 예외 유형을 정의하고 구현 특정 오류를 래핑하는 것이 일반적입니다 (예 : Spring 또는 Hibernate를 살펴보십시오).

예외를 검사하거나하지 않는 것은 스타일의 문제입니다. 발신자가 기꺼이 오류 상태를 처리 할 수있는 좋은 기회가있는 경우 (예 : 동시 업데이트가 감지 됨), 그렇지 않으면 선택되지 않습니다 (예 : 데이터베이스 연결 오류). 검사되지 않은 예외는 응용 프로그램 코드를 통해 '버블 링 (bubble)'되어야합니다 (잡히지 않음). 오류 페이지/화면을 표시하여 상위 수준에서 처리해야합니다.

관련 문제