Обработка RestClientException и HttpClientErrorException - PullRequest
0 голосов
/ 02 мая 2019

Я обрабатываю несколько запросов, делая вызов 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, упомянутое в моем коде, никогда не достигает, поскольку оно обрабатывается.

Не могли бы вы помочь мне эффективно обработать каждое исключение в этой иерархии?

1 Ответ

2 голосов
/ 02 мая 2019

Вы никогда не должны делать if-else в блоке catch для обработки различных исключений.Код не читается, возможно, медленнее в исполнении, и в вашем примере любое исключение (кроме HttpClientErrorException) обрабатывается как RestClientException.

Обрабатывайте их с помощью соответствующих блоков перехвата, таких как это (сначала более конкретные исключения, например HttpClientErrorException перед RestClientException:

catch (HttpClientErrorException hcee) {
    if (hcee.getStatusCode() == NOT_FOUND) {
        throw new MyRecordNotFoundException(hcee);
    }
}
catch (final RestClientException rce) {
    handleRestClientException(rce, Constants.MYAPP);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...