다른 시나리오에 대해 매우 특정한 예외 유형이있는 타사 라이브러리에서 작업하고 있습니다. 나는이 (다소 단순화 된 버전)처럼 그들을 사용하고 싶습니다 :액세스 할 수없는 예외 유형 처리
try
{...}
catch (IllegalFooOperationException e)
{
//handle an illegal foo
}
catch (InvalidBarValueException e)
{
//handles very differently from the illegal foo.
}
불행하게도, IllegalFooOperationException
및 InvalidBarValueException
이 이 public 클래스없는 : 그들은 패키지 범위입니다. 그들은보다 일반적인 일반 전화 GenericThirdPartyAPIException
클래스를 상속받습니다.
는 지금, 작품이-의 종류 :
catch (GenericThirdPartyAPIException e)
{
String rootExceptionTypeName = e.getClass().getName();
if (rootExceptionTypeName.equals("someAPI.IllegalFooOperationException"))
{
//handle illegal foo
}
else if (rootExceptionTypeName.equals("someAPI.InvalidBarValueException"))
{
...
}
}
는하지만이 바로 생각하지 않습니다. 한 가지 잠재적 인 문제점은 패키지 또는 클래스 이름이 나중에이 라이브러리에서 변경되면이 코드는 런타임에 올바른 예외 클래스를 찾을 수 없다는 것입니다. 나는 런타임에 객체의 클래스를 알아내는 것에 의존하지 않는 것을 좋아한다.
나는 또한 예외 메시지를 직접 파싱하려고 생각했지만 거기에 관심이있는 예외 중 일부가 여기에 모두 표시되어 있지 않습니다. 은 동일한 메시지를 가지고 있지만 다른 유형일 수 있습니다.
이 상황을 처리하는 더 좋은 방법이 있습니까?
"하지만 이것만으로는 옳은 생각이 들지 않습니다."- 도서관 디자이너가 나쁜 선택을 할 때 일어나는 일입니다. 도서관 저자에게 예외 사항을 공개하도록 요청할 수 있습니까? –
패키지가 보호되는 예외 유형으로 'instanceof'를 사용할 수 없습니다. – Antoniossss
@JonSkeet : 확실하게 물어볼 수는 있지만 회신 여부와 관계없이 변경을 원할 경우에도 * my * 코드를 배포해야합니다. – FrustratedWithFormsDesigner