2015-01-16 5 views
2

다른 시나리오에 대해 매우 특정한 예외 유형이있는 타사 라이브러리에서 작업하고 있습니다. 나는이 (다소 단순화 된 버전)처럼 그들을 사용하고 싶습니다 :액세스 할 수없는 예외 유형 처리

try 
{...} 
catch (IllegalFooOperationException e) 
{ 
    //handle an illegal foo 
} 
catch (InvalidBarValueException e) 
{ 
    //handles very differently from the illegal foo. 
} 

불행하게도, IllegalFooOperationExceptionInvalidBarValueException public 클래스없는 : 그들은 패키지 범위입니다. 그들은보다 일반적인 일반 전화 GenericThirdPartyAPIException 클래스를 상속받습니다.

는 지금, 작품이-의 종류 :

catch (GenericThirdPartyAPIException e) 
{ 
    String rootExceptionTypeName = e.getClass().getName(); 
    if (rootExceptionTypeName.equals("someAPI.IllegalFooOperationException")) 
    { 
     //handle illegal foo 
    } 
    else if (rootExceptionTypeName.equals("someAPI.InvalidBarValueException")) 
    { 
     ... 
    } 
} 

는하지만이 바로 생각하지 않습니다. 한 가지 잠재적 인 문제점은 패키지 또는 클래스 이름이 나중에이 라이브러리에서 변경되면이 코드는 런타임에 올바른 예외 클래스를 찾을 수 없다는 것입니다. 나는 런타임에 객체의 클래스를 알아내는 것에 의존하지 않는 것을 좋아한다.

나는 또한 예외 메시지를 직접 파싱하려고 생각했지만 거기에 관심이있는 예외 중 일부가 여기에 모두 표시되어 있지 않습니다. 은 동일한 메시지를 가지고 있지만 다른 유형일 수 있습니다.

이 상황을 처리하는 더 좋은 방법이 있습니까?

+4

"하지만 이것만으로는 옳은 생각이 들지 않습니다."- 도서관 디자이너가 나쁜 선택을 할 때 일어나는 일입니다. 도서관 저자에게 예외 사항을 공개하도록 요청할 수 있습니까? –

+1

패키지가 보호되는 예외 유형으로 'instanceof'를 사용할 수 없습니다. – Antoniossss

+0

@JonSkeet : 확실하게 물어볼 수는 있지만 회신 여부와 관계없이 변경을 원할 경우에도 * my * 코드를 배포해야합니다. – FrustratedWithFormsDesigner

답변

2

초기화시 반드시 IllegalFooOperationException을 던져서 예외 클래스를 변수에 저장하십시오. 다른 예외에 대해서도 똑같은 일을하고, 모든 예외 클래스를 가지고 있습니다.

저는 이것이 좋은 습관이 아니라는 것을 알고 있습니다. (패키지 보호 예외도 마찬가지이기 때문에) 런타임에 적절한 예외 클래스를 찾을 수 있습니다.

+1

이제는 하드 코어 해결 방법 중 하나입니다 ........................... – Antoniossss

+0

아 감사합니다! :) – Gaetano

+0

흠, 그건 재미있는 생각입니다! – FrustratedWithFormsDesigner