我正在尝试扩展一些遗留代码,以使其更能容忍网络中断。我有一些(遗留的)groovy代码,它通过wslite包装对webservice(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
我应该怎样做才能捕捉并对相应的例外做出反应?
答案 0 :(得分: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这样的动态语言更有可能抛出意想不到的运行时异常。捕获所有运行时异常将确保groovy异常不会感染程序的其余部分。