我正在使用具有针对不同情况的某些非常特殊的异常类型的第三方库。我想这样使用它们(一个简化的版本):

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


不幸的是,IllegalFooOperationExceptionInvalidBarValueException不是公共类:它们是包范围的。它们从更通用的公共GenericThirdPartyAPIException类继承。

现在,这种工作方式如下:

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


但这感觉不对。一个潜在的问题是,如果将来在此库中更改包或类的名称,则此代码将无法在运行时找到正确的异常类。如果不需要,我不喜欢依赖于在运行时确定对象的类。

我还考虑过尝试直接解析异常消息,但是我感兴趣的某些异常(此处未显示所有异常)可能具有相同的消息,但类型不同。

有没有更好的方法来处理这种情况?

最佳答案

在初始化中,您可以执行一个肯定引发IllegalFooOperationException的方法,并将异常的类保存在变量中。
对其他异常执行相同的操作,则应该拥有所有异常类。

我知道这不是一个好习惯(因为包受保护的异常也是如此),但是您将能够在运行时找到正确的异常类。

关于java - 处理无法访问的异​​常类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27986645/

10-11 20:03