2

ネットワーク障害に対する耐性を高めるために、一部のレガシー コードを拡張しようとしています。wslite を介して Web サービス (CallWebService) への呼び出しをラップする (レガシー) groovy コードがいくつかあります。時々、この呼び出しは 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) をキャッチし、呼び出しを再試行することです (おそらくグリッチであるため) 1 回か 2 回です。

追加しようとすると

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 のような動的言語は、予期しない実行時例外をスローする可能性が高くなります。また、すべての実行時例外をキャッチすることで、groovy 例外がプログラムの残りの部分に影響を与えないようにすることができます。

于 2013-02-11T20:57:00.727 に答える