我正在使用第三方库,该库具有针对不同方案的一些非常特定的异常类型。我想像这样使用它们(有点简化的版本):
try
{...}
catch (IllegalFooOperationException e)
{
//handle an illegal foo
}
catch (InvalidBarValueException e)
{
//handles very differently from the illegal foo.
}
不幸的是,IllegalFooOperationException
和InvalidBarValueException
不是公共类:它们是包范围的。它们继承自更通用的公共GenericThirdPartyAPIException
类。
现在,这种工作:
catch (GenericThirdPartyAPIException e)
{
String rootExceptionTypeName = e.getClass().getName();
if (rootExceptionTypeName.equals("someAPI.IllegalFooOperationException"))
{
//handle illegal foo
}
else if (rootExceptionTypeName.equals("someAPI.InvalidBarValueException"))
{
...
}
}
但这感觉不对。一个潜在的问题是,如果将来在此库中更改包或类名,则此代码将无法在运行时找到正确的异常类。如果我不需要,我不喜欢在运行时依赖于计算对象的类。
我还想过尝试直接解析异常消息,但是我感兴趣的一些例外(并非所有这些都在这里显示)可能具有相同的消息,但是不同的类型。
有没有更好的方法来处理这种情况?
答案 0 :(得分:2)
在初始化中,您可以执行一个方法,该方法肯定会抛出 IllegalFooOperationException 并将异常的类保存在变量中。 对其他异常做同样的事情,你应该拥有所有异常类。
我知道这不是一个好习惯(因为包受保护的异常也是如此)但你可以在运行时找到正确的异常类。