2013-02-11 173 views
2

我试图扩展一些遗留代码,使其更容忍网络中断。我有一些(遗留)groovy代码,它通过wslite打包调用web服务(CallWebService)。有时候,这种调用抛出无论是wslite.http.HTTPClientException或java.net.ConnectException例外如何在java中捕捉异常抛出的异常?

调用该Groovy代码的代码(这已被添加 log.info("Exception " + ex.getClass().getName() + " throw"); 我log4j的日志记录来确定)是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

编译器错误告诉你ConnectException是一个检查异常,它不被catch块内的任何内容声明。你确定你有正确的例外吗? – jtahlborn 2013-02-11 15:29:55

+0

当然?不,但我得到我的log4j代码来执行以下操作:log.info(“Exception”+ ex.getClass()。getName()+“throw”);它似乎给我java.net.ConnectException作为例外 – Jane 2013-02-11 15:31:21

+1

的名称是“顶级”异常,还是嵌套在另一个异常(例如HTTPClientException)? – jtahlborn 2013-02-11 15:39:34

回答

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这样的动态语言更可能引发意料之外的运行时异常。捕捉所有运行时异常将确保常规异常不会感染程序的其余部分。

+0

它似乎甚至没有抛出一个运行时异常,只是冒泡入一个例外。在异常处理中,我可以做比较的实例。不知道,但... – Jane 2013-02-12 10:33:41

+0

糟糕。意思是把Exception作为catch-ed类型,而不是RuntimeException,但看起来像你有想法。 – 2013-02-12 16:59:40