2

我正在尝试扩展一些遗留代码以使其更能容忍网络中断。我有一些(遗留)groovy 代码,它通过 wslite 封装了对 web 服务(CallWebService)的调用。有时,此调用会引发 wslite.http.HTTPClientException 或 java.net.ConnectException 异常(这已通过添加 log.info("Exception " + ex.getClass().getName() + " throw"); 到我的 log4j 日志记录中来确定)

调用这个 groovy 代码的代码在 java 中,如下所示:

public static String getDataFromWebService(String webServiceUrl, String referenceNumber) {
try {       
    ReturnedData returnedData = new CallWebService(webServiceUrl, referenceNumber);
    return (String)returnedData.toXml();
}
catch (Exception ex) {
    log.info("Exception caught: class of exception is " + ex.getClass().getName());
    throw ex;
}

我想要做的是捕获抛出的异常(wslite.http.HTTPClientException 或 java.net.ConnectException)并重试调用(因为它可能是一个小故障)一次或两次。

当我尝试添加

catch (java.net.ConnectException ex)

并构建,构建失败

exception ConnectException is never thrown in body of corresponding try statement

我应该怎么做才能捕捉到适当的异常并做出反应?

4

1 回答 1

2

在您的 Java 代码中,我会执行以下操作:

try {
  callGroovy();
} catch (RuntimeException e) {  // EDIT --- Should be Exception, RuntimeException
  if (e instanceof HTTPClientException || e.getCause() instanceof ConnectException) {
    throw e;
  }
  // log other exception...
}

这比捕获单个异常类型要安全一些。以我的经验,像 groovy 这样的动态语言更有可能抛出意料之外的运行时异常。捕获所有运行时异常将确保常规异常不会感染程序的其余部分。

于 2013-02-11T20:57:00.727 回答