40.6. 捕获从远程服务返回的例外


概述

消费者发出异步请求,在请求同步请求时不会收到同样的异常。异步返回给使用者的任何例外都会在 ExecutionException 异常中嵌套。服务引发的实际异常存储在 ExecutionException 异常 原因 字段中。

捕获异常

远程服务生成的例外是因为将响应传递给消费者的业务逻辑的方法在本地发出。当使用者发出同步请求时,导致远程调用的方法会抛出异常。当消费者发出异步请求时,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 异常.

从异常中提取 原因 字段。

如果消费者使用回调方法,则用于捕获异常的代码将放置在提取服务响应的回调对象中。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.