首页 > 解决方案 > 处理 RestClientException 和 HttpClientErrorException

问题描述

我通过向第 3 方进行 RESTFul 调用(Spring RestTemplate)来处理一些请求。在代码中,我正在尝试处理以下条件。

     catch (final Exception ex) {
  if (ex instanceof HttpClientErrorException) {
      HttpClientErrorException hcee = (HttpClientErrorException)ex;
      if(hcee.getStatusCode() == NOT_FOUND) {
          throw new MyRecordNotFoundException(hcee);
      }
  }else {
      handleRestClientException(ex, Constants.MYAPP);
  }

这是 handleRestClientException 实现

    protected Exception handleRestClientException(Exception ex, String serviceName) throws Exception{
  if (ex instanceof RestClientResponseException) {
      RestClientResponseException rcre = (RestClientResponseException) ex;
      throw new RestClientResponseException(serviceName, rcre.getRawStatusCode(),
              rcre.getStatusText(), rcre.getResponseHeaders(), rcre.getResponseBodyAsByteArray(), null);
  } else {
      throw new Exception(serviceName, ex);
  }

但是所有 org.springframework.web.client.RestTemplate.getForObject(String url, Class responseType, Map urlVariables) 都会抛出 RestClientException

哪个是 HttpClientErrorException 的父级

    java.lang.Object
      java.lang.Throwable
       java.lang.Exception
        java.lang.RuntimeException
         org.springframework.core.NestedRuntimeException
          org.springframework.web.client.RestClientException
           org.springframework.web.client.RestClientResponseException
            org.springframework.web.client.HttpStatusCodeException
             org.springframework.web.client.HttpClientErrorException

因此,我的代码中提到的 if 条件在处理时永远不会达到。

你能帮我有效地处理这个层次结构中的每个异常吗?

标签: javaexception

解决方案


您永远不应该if-else在 catch 块中处理不同的异常。该代码不可读,执行速度可能较慢,并且在您的示例中,任何异常(除了HttpClientErrorException)都像RestClientException.

像这样使用适当的 catch 块处理它们(首先是更具体的异常,即HttpClientErrorException在之前RestClientException

catch (HttpClientErrorException hcee) {
    if (hcee.getStatusCode() == NOT_FOUND) {
        throw new MyRecordNotFoundException(hcee);
    }
}
catch (final RestClientException rce) {
    handleRestClientException(rce, Constants.MYAPP);
}

推荐阅读