2

我有一个使用 Hessian 进行 Web 服务调用的 Java 1.4 Web 应用程序。我试图将它写得尽可能健壮和透明。在调用代理时,我不希望任何粗麻布异常使其脱离我的委托类。我希望能够捕获任何 Hessian 运行时异常,解开它们并重新抛出一些主要异常(例如,ConnectException)或将它们重新包装在另一个异常中。但是找到这些例外是一个挑战。

我在委托类中使用的每个方法都有这种结构。

public MyResult myMethod(MyArgsType myArgs)
        throws ConnectException
{
    try
    {
        return proxy.myMethod(myArgs);
    }
    catch (HessianRuntimeException ex)
    {
        Throwable cause = ex.getCause();
        if (cause instanceof ConnectException)
            throw (ConnectException)cause;
        throw new MyRuntimeException(cause);
    }
}

这在我自己的测试中运行良好,但其他一些运行时异常正在出现,我错过了它们。例如,我们最近发现它可能会抛出HessianConnectionException由 a 引起的SocketException(远程服务器已关闭)。我完全期待我目前拥有的东西会抓住它。HessianConnectionException不是从 派生的,所以HessianRuntimeException现在我必须添加要捕获的异常。

public MyResult myMethod(MyArgsType myArgs)
        throws SocketException, ConnectException
{
    try
    {
        return proxy.myMethod(myArgs);
    }
    catch (HessianException ex) // HessianConnectionException derives from HessianException
    {
        Throwable cause = ex.getCause();
        if (cause instanceof SocketException)
            throw (SocketException)cause;
        throw new MyRuntimeException(cause);
    }
    catch (HessianRuntimeException ex)
    {
        Throwable cause = ex.getCause();
        if (cause instanceof ConnectException)
            throw (ConnectException)cause;
        throw new MyRuntimeException(cause);
    }
}

好吧,这对我来说很好,它必须完成......但它在哪里结束?我找不到任何关于我需要注意的其他运行时异常或其任何根本原因的文档。

我希望只要抓住HessianExceptionHessianRuntimeException足够了,因为这些是我可以在此处找到的唯一运行时异常。但是对于这些新发现的问题,我不确定我想要解开哪些异常,因为它看起来像是一个混合包(据我所知,SocketException并且ConnectException是同一问题的不同表示)。

在通过代理调用方法时抛出哪些运行时异常及其所有潜在原因是否有任何文档?

4

1 回答 1

0

我假设您已经完成了网络搜索等,所以这里是一个备用位置,以防您找不到您正在寻找的文档。

在您现有的捕获之后,捕获 RuntimeException。测试异常的类名是否以“Hessian”开头和/或检查其包名。如果它不是源自 Hessian 的,则重新抛出。

在您知道这是一个 Hessian 异常之后,您可以执行与当前策略类似的操作,通过原因链查找在您的上下文中有意义或至少来自非 Hessian 包的内容。

于 2012-11-06T01:37:39.610 回答