40.6. 从远程服务捕获异常
概述
在请求同步请求时,进行异步请求的用户不会接收到相同的例外。任何异步返回到消费者的异常都会在 ExecutionException 异常中嵌套。服务引发的实际异常保存在 ExecutionException 异常的 cause
字段中。
捕获异常
通过向消费者的业务逻辑传递响应的方法,会抛出远程服务生成的异常。当消费者发出同步请求时,进行远程调用的方法会引发异常。当消费者发出异步请求时,Response<T> 对象的 get()
方法会抛出异常。在尝试检索响应消息前,使用者不会发现在处理请求时遇到错误。
与 JAX-WS 框架生成的方法不同,Response<T> 对象的 get()
方法不会抛出用户模型异常或通用 JAX-WS 例外。相反,它会引发 java.util.concurrent.ExecutionException 异常。
获取例外详情
框架将从远程服务返回的异常存储在 ExecutionException 异常的 cause
字段中。通过获取 cause
字段的值并检查存储的异常,可以提取远程异常的详细信息。存储的例外可以是任何用户定义的例外,也可以是一个通用 JAX-WS 例外。
示例
例 40.11 “使用轮询方法捕获例外” 显示使用轮询方法捕获异常的示例。
例 40.11. 使用轮询方法捕获例外
package demo.hw.client; import java.io.File; import java.util.concurrent.Future; import javax.xml.namespace.QName; import javax.xml.ws.Response; import org.apache.hello_world_async_soap_http.*; public final class Client { private static final QName SERVICE_NAME = new QName("http://apache.org/hello_world_async_soap_http", "SOAPService"); private Client() {} public static void main(String args[]) throws Exception { ... // port is a previously established proxy object. Response<GreetMeSometimeResponse> resp = port.greetMeSometimeAsync(System.getProperty("user.name")); while (!resp.isDone()) { // client does some work } try { GreetMeSometimeResponse reply = greetMeSomeTimeResp.get(); // process the response } catch (ExecutionException ee) { Throwable cause = ee.getCause(); System.out.println("Exception "+cause.getClass().getName()+" thrown by the remote service."); } } }
例 40.11 “使用轮询方法捕获例外” 中的代码执行以下操作:
在 try/catch 块中嵌套对 Response<T> 对象的 get()
方法的调用。
捕获执行Exception 异常。
从异常中提取 原因
字段。
如果使用者使用回调方法,用于捕获异常的代码将放入提取服务的响应的回调对象中。