2013-10-16 3 views
0

내가 코드 예제를 다음과 같습니다일반적으로 메서드가 많은 수의 예외를 throw하는 경우?

private boolean openThroughCommPort(IProgressMonitor monitor, int portNum) 
     throws InterruptedException, PortInUseException, IOException, 
     UnsupportedCommOperationException, TooManyListenersException, 
     UnsupportedVehicleException, InnerCanceledException { 
     ... 
     } 

나는 그것이 좋은 방법이 확실하지 그렇게는 - 메소드 서명에 많은 많은 예외가 발생합니다.

아마도이 사례에 대해 가장 잘 알고있는 사례를 말해 줄 수 있습니까?

+0

언제든지 Exception을 시작할 수 있습니다. 모든 예외는 그것으로부터 상속받습니다. –

+0

해당 메소드를 호출하는 코드에서 어떤 예외가 발생했는지 알고 있습니까? – assylias

+0

@CarlosLanderas : 그건 정말 나쁜 생각입니다 - 효과적인 문서화가 줄어 듭니다. –

답변

6

우선 메소드가 많은 예외를 던지면 메소드가 너무 많은 일을하고 있음을 의미합니다. 작업을 별도의 방법으로 배포하는 것을 고려해야합니다.

두 번째로 발신자 (발신자가 동일한 추상화 수준에 있음)가 정확한 예외가 발생했는지 확인하고 특정 작업을 수행하는 것이 중요하면 개별 예외를 throw하고 랩하지 않는 것이 더 합리적입니다. 또한 @ 존 스키켓 (Jon Skeet)이 지적한 사실은 효과적인 문서화 가능성을 줄인다는 것입니다.

호출자가 정확한 원인을 알 필요가없는 경우 추상화 수준이 다르면 호출자의 추상화 수준과 인라인 인 사용자 정의 예외에서 예외를 래핑하는 것이 좋습니다.

0

독자적인 래퍼 예외를 만들고 해당 방법에서 try/catch를 사용하는 것이 좋습니다. Narendra Pathai는 호출자가 원래 예외가 발생했는지에 따라 진행할 사람을 결정할 필요가없는 경우에만 수행하면됩니다.

당신은 그런 당신의 예외를 포장 할 수 있습니다

try{ 
    //do something 
} catch(Exception e){ 
    throw new WrapperException(e); 
} 
+0

자세한 내용을보고 싶습니다 – gstackoverflow

+0

내 생각에 그것은 sintaksis에 의해 허용되지만 본질적으로 잘못되었습니다 – gstackoverflow

0

그것을 일반화보다는 특정 예외를 처리하는 것이 좋습니다. 수많은 예외를 던지면서 잘못된 점은 없습니다. 이것은 또한 문서화에 도움이 될 것입니다.

0

InterruptedException을 감싸거나 삼키지 마십시오. 그렇지 않으면 응용 프로그램이 스레드 된 컨텍스트에서 제대로 작동하지 않습니다. 그냥 참조 링크의 부부, 적절한 방법으로 처리해야합니다 :
http://www.ibm.com/developerworks/java/library/j-jtp05236/
Java Thread Sleep and Interrupted Exception

호출 방법은 예외를 처리하거나 최대 흐름 수 있도록해야한다. 메소드의 Javadoc에 간단한 설명을 추가 할 수 있습니다.

+0

어떤 세계에서이 질문에 대한 대답을 제공합니까? –

관련 문제