Java中的巨大异常处理块

Java中的巨大异常处理块,java,exception-handling,Java,Exception Handling,目前,我使用的库可能会抛出大量不同的异常(每个方法调用8-10个),并且大多数异常都必须得到处理,更糟糕的是,每个方法(在任何时候)都可能抛出AuthenticationExpiredException,我必须重新尝试进行身份验证。例如: try { xStream = xSet.createXStream(id, binding, mimeType); //Method call } catch (AuthenticationExpiredException authe

目前,我使用的库可能会抛出大量不同的异常(每个方法调用8-10个),并且大多数异常都必须得到处理,更糟糕的是,每个方法(在任何时候)都可能抛出
AuthenticationExpiredException
,我必须重新尝试进行身份验证。例如:

try {
        xStream = xSet.createXStream(id, binding, mimeType); //Method call
    } catch (AuthenticationExpiredException authenticationExpiredException) {
        try {
        this.authenticate(); // re-authenticate
        xStream = xSet.createXStream(id, binding, mimeType); //Method call again
        } catch (XAMException xamException) {
        throw new ConnectorException(
            "Error occurred during creating new Blob after attempting to re-authenticate",
            xamException);
        }
    } catch (XSystemCorruptException xSystemCorruptException) {
        this.entities.clear();
        this.closeConnection();     

        throw new ConnectorException("XSystem was corrupt and connection was closed",
            xSystemCorruptException);
    } catch (XSetCorruptException xSetCorruptException) {
        this.closeEntity(entity);

        throw new ConnectorException("XSet for entity: " + entity.getXuid()
            + " was currupt and removed", xSetCorruptException);
    } catch (XAMException xamException) {
        throw new ConnectorException(
            "Error occurred during creating new Blob.", xamException);
    }
这是异常处理的最小示例之一。这里的主要问题是,有没有办法减少处理异常的代码量,并使逻辑更干净

更新 谢谢你的反馈。我决定通过包装每个方法并分别处理它们来为这个库创建单独的包装器。为了支持不同的处理方法,我为包装器创建了接口,然后用自定义包装器实现它,如下所示:

public interface XAMLibraryWrapper{
    // Methods
}

/**
 * Will attempt to recover before throwing RuntimeException
 */
public class RecoveringXAMLibraryWrapper implements XAMLibraryWrapper{
    // Implementation
}

如果API确实设计为抛出那么多异常,并且每个异常都需要不同的处理,那么您就无能为力了


您可以做的一件事是在一个单独的方法中移动重复的代码,或者使用Java 7 multi-catch。

如果您对每个异常都有不同的操作,恐怕所有这些catch语句都是必需的。但是,如果您有许多catch语句具有相同的内容,或者有许多资源需要关闭,那么您可能需要了解新的Java7特性,例如一个catch中的多个异常和自动资源处理。但是我不确定Java 7是否适合您。

如果有一致的方法来处理这些方法(即,您总是以相同的方式包装它们并重新抛出
运行时异常,那么定制包装器库可能是合适的方法。当有2-3种不同的方法来处理它们时,这仍然可以工作(通过为单个包装的方法/类提供2-3个包装方法(甚至类)


或者,如果两个或多个异常类型具有完全相同的处理代码,那么您可以尝试查找Java 7。

您可以使用模式。这是一个很好的示例,说明了此设计模式如何简化异常严重的代码(
SQLException
s).

我并不是说这是最好的主意,但您可以使用自己的代码对库进行精简,并将任何异常打包为运行时异常(因此,您不需要在每次方法调用中捕获8-10个异常)API包装器也可以处理重试。我想说的是,我将把这个库从业务逻辑中分离出来,并以尽可能简单的方式向业务逻辑提供一个适配器/桥接器。