2015-01-26 1 views
3

이와 같은 코드를 작성해야하는 이유가 있습니까? try 블록이 명시 적으로 예외를 throw하는 코드를 포함하지 않은 경우 예외를 다시 throw해야하는 이유가 있습니까?

try { 
    foo(); 
} catch (final Exception e) { 
    throw e; 
} 

foo()의 선언이 나는이 적합 할 수 있습니다 이유를 명시 적으로 단지보다는 예외 처리 좋을 것 얻을 void foo() throws Exception 경우

비록 다시는-던져,하지만 난 적어도 그것을 만드는 방법을 볼 수 있습니다 감각 ( foo()은 확인 된 예외를 throw하므로 catch되거나 throw되어야 함).

그러나 foo()의 선언에서 예외 인 throws이 없다면이 점이 있습니까? 아니면 코딩이 잘못 되었습니까?

+2

catch하지 않으면 새로 throw 된 예외처럼 호출 스택이 올라갑니다. 일반적으로 로그에 쓰고 싶거나 예외를이 컨텍스트에서 좀 더 의미있는 것으로 변경하려는 경우에만 catch 및 rethrow합니다. –

+2

예를 들어 로깅과 같은 예외가 발생하면이를 전달할 수 있습니다. – OldProgrammer

+0

또는 어떤 종류의 고급 예외로 랩핑 할 수 있습니다. – Mysterion

답변

2

예를 들어, 그렇게 할 필요가 없습니다. 그러나, 내가 본 대부분의 소프트웨어는 일반적으로 몇 가지 (호출 스택에 5 개 이상의 레이어) 전파되는 예외에 대한 여러 수준의 로깅을 가지고 있습니다. 이런 식으로 뭔가 일반적입니다 :

catch (final Exception e) { 
    logger.log(Level.ERROR, srcInfo, "Exception in ..."); 
    throw e; 
} 

그러나 이것은 자신의 로깅을 수행 할 수 있습니다 호출 방법부터도 오용 될 수 있으며,이 로그에 많은 반복으로 남아있을 것입니다, 그러나 이것은 디자인 문제입니다. 더 일반적으로, 상기 방법은 예

catch (CustomPlatformException e) {//log and throw e 
    } 

들어, 특정 예외를 잡을 Exception의 모든 서브 클래스를 캐치 특정 흐름에 별도 일반적인 오류를 기록하는 높은 촬영 방법에 다시 던져.

catch (Exception e) {//Log general failure in flow, usually at a higher logging level 
    } 
+1

"그러나이 방법은 호출하는 메서드가 자체 로깅을 수행 할 수 있으므로 잘못 사용될 수도 있습니다." 예, 예, 예! 제발 "로그 앤 리버스"하지 마세요. 일반적으로 둘 다 처리하거나 다시하지는 ​​않습니다. – sleske

1
아니 정확히 같은

,하지만 당신이 유사한 패턴을 볼 수는 예외 번역 (유효 자바 항목 61)라고합니다.

처음에 foo()Exception을 표시하도록 선언되어서는 안됩니다. 당신은 또한 당신의 추상화에 더 적합한 무언가로 예외를 번역하는이 패턴을 사용할 수 있습니다

try { 
    foo(); 
} catch (final Exception e) { 
    // maybe test the actual class of e here 
    throw new MoreAppropriateException(e); 
} 

: 그것은 당신이 그것을 변경할 수없는 경우에, 당신은 다음처럼 작성할 수 있습니다. EJ의 예제를 사용하려면 Iterator을 사용하여 요소를 검색하는 메소드가 있다고 가정 해보십시오. 나중에 변경하는 경우에 대비하여 Iterator을 사용한다는 사실을 폭로하고 싶지 않으므로 NoSuchElementException을 잡고 IndexOutOfBoundsException으로 변환하십시오. 마찬가지로 제 3 자 API를 내부적으로 사용하는 API를 작성하는 경우 제 3 자 API 사용을 피하기 위해 제 3 자 예외를 번역해야합니다.

+0

좋은 지적. 나는 '예외'와 반대되는 예외에 대해 말하고 있었음을 명심해야했지만, 이것은 여전히 ​​매우 좋은 통찰력이다. –

관련 문제