如何在java中捕获groovy抛出的异常?
我试图扩展一些遗留代码,使其更能容忍网络中断。我有一些(遗留的)groovy代码,它封装了通过wslite对webservice(CallWebService)的调用。有时,此调用会引发wslite.http.HTTPClientException或java.net.ConnectException异常(这已通过添加如何在java中捕获groovy抛出的异常?,java,exception,groovy,Java,Exception,Groovy,我试图扩展一些遗留代码,使其更能容忍网络中断。我有一些(遗留的)groovy代码,它封装了通过wslite对webservice(CallWebService)的调用。有时,此调用会引发wslite.http.HTTPClientException或java.net.ConnectException异常(这已通过添加 log.info(“异常”+ex.getClass().getName()+“抛出”); 到我的日志(4j日志) 调用此groovy代码的代码是java,如下所示: public
log.info(“异常”+ex.getClass().getName()+“抛出”);
到我的日志(4j日志)
调用此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)
和build,则build失败
exception ConnectException is never thrown in body of corresponding try statement
我应该怎么做才能捕获并响应适当的异常?在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异常不会感染程序的其余部分。编译器错误告诉您ConnectException是一个已检查的异常,它不是由catch块中的任何内容声明的。你确定你有正确的例外吗?当然?没有,但是我得到了我的log4j代码来执行以下操作:log.info(“Exception”+ex.getClass().getName()+“throw”);它似乎给了我java.net.ConnectException作为异常的名称是“顶级”异常,还是嵌套在另一个异常中(例如HTTPClientException)?排除天真,但是,我怎么知道呢?啊哈,它将让我捕获HTTPException,这是朝着正确方向迈出的一步。。。感谢cluesIt,它甚至没有抛出运行时异常,只是被冒泡到异常中。在异常处理中,我可以执行比较实例。不是主意,而是……哎呀。旨在将Exception作为catch-ed类型,而不是RuntimeException,但看起来您明白了。