我有一个Java 1.4 Web应用程序,该应用程序使用Hessian进行Web服务调用。我试图将其尽可能强大和透明。我不希望任何Hessian异常在打电话给代理时从我的代表课中脱颖而出。我希望能够捕获任何Hessian Runtime异常,解开它们,然后再重新将一些主要异常(例如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);
}
}
这在我自己的测试中运行良好,但是其他一些运行时例外也使它脱颖而出,我很想念它们。例如,我们最近发现它可能会抛出由SocketException
引起的HessianConnectionException
(远程服务器已关闭)。我完全期望我目前已经抓到的东西。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);
}
}
好吧,这对我来说很好,它必须完成...但是它在哪里结束?我找不到有关我需要注意的其他运行时例外或其任何基本原因的任何文件。
我希望只捕获HessianException
,而HessianRuntimeException
就足够了,因为这些是我在此处列出的唯一运行时例外。但是由于这些新发现的问题,我不确定我想解开什么例外,因为这似乎是一个混合的包(据我所知,SocketException
和ConnectException
是同一问题的不同表示)。
通过代理调用方法及其所有基本原因时,是否有任何文档在哪个运行时例外?
我假设您已经完成了Web搜索等,因此,这是一个后备位置,以防您找不到您要寻找的文档。
在您现有的捕获后,捕获RuntimeException。测试例外的类名是否以" Hessian"开头和/或检查其软件包名称。如果不被黑森州填充,请重新。
知道这是一个黑森例外,您可以做类似于当前策略的事情,浏览因子链中的某些东西在上下文中有意义或至少来自非黑森州的软件包。
<。