java 处理REST客户端异常和HttpClient错误异常

pdkcd3nj  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(387)

我正在通过向第三方发出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);
  }

但是所有的组织、springframework、web、client、restTemplate、getForObject(字符串url、类响应类型、Mapurl变量)都会抛出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条件在处理时永远不会到达。
你能帮助我有效地处理这个层次结构中的每个异常吗?

j5fpnvbx

j5fpnvbx1#

你不应该在catch块中使用if-else来处理不同的异常。代码不可读,可能执行速度较慢,在你的例子中,任何异常(除了HttpClientErrorException)都像RestClientException一样处理。
使用适当的catch块处理它们,如下所示(首先是更具体的异常,即HttpClientErrorExceptionRestClientException之前:

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

kh212irz2#

这对许多其他人都有帮助。
HttpClientErrorException是HttpStatusCodeException的子类,HttpStatusCodeException是RestClientResponseException的子类。
正确的处理包括处理RestClientResponseException和ResourceAccessException
RestClientException有这两个直接子类。
当调用成功但存在无效响应(如500、400)时,将引发RestClientResponseException。
当调用的API因TLS/代理而关闭或无法访问时,会引发RestClientException。

try {
        
    responseEntity = restTemplate.exchange(url,
            HttpMethod.POST, requestEntity,
            <ResponseType.class>);
} catch (RestClientResponseException rcre) {
    
    log4jlogs.error(
            "Business exception while calling the API! Error message: {}, Response Body: {} ",
            rcre.getMessage(), rcre.getResponseBodyAsString(), rcre);
    throw rcre;  // else throw custom business exception
} catch (ResourceAccessException rac) {
    log4jlogs.error(
            "System Exception. API not found, Error message: {}, rac.getMessage()",
            rac);
    throw rac; // else throw custom system exception
}

相关问题