Каков хороший способ обернуть это исключение? - PullRequest
1 голос
/ 07 апреля 2020

Я внедряю HealthIndicator для своего приложения Springboot, которое проверяет экземпляры Jenkins, проверяют ли они. Я делаю это, пинг ${JENKINS_URL}/login. Если это произойдет, я получу ответ 200. Если это не так, я получаю очень некрасивую трассировку стека, например:

org.springframework.http.InvalidMediaTypeException: Invalid mime type "html": does not contain '/'
    at org.springframework.http.MediaType.parseMediaType(MediaType.java:574) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.http.HttpHeaders.getContentType(HttpHeaders.java:966) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.getCharset(DefaultResponseErrorHandler.java:224) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:165) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:785) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:743) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:677) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:345) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at com.path.to.package.JenkinsCache.pingJenkins(JenkinsCache.java:60) [classes/:na]

Мой код драйвера выглядит следующим образом (в JenkinsCache):

private String pingJenkins(String jenkinsEndpoint) {
     RestTemplate restTemplate = new RestTemplate();
     try{
            restTemplate.getForEntity(jenkinsEndpoint+"/login", String.class);
            return "OK";
        } catch (Exception e) {
            log.error("An error occurred while pinging: "+jenkinsEndpoint, e);
        }
        return "DOWN";
    }

Я бы предпочел перехватить указанное c исключение, но если при проверке связи с экземпляром Jenkins, который не работает, получается InvalidMediaTypeException, он выглядит немного запутанным фрагментом кода (то есть я ожидал бы что-то вроде RestClientException, et c). Каков хороший способ поймать / обработать это исключение? Должен ли я поймать RuntimeException вместо этого?

1 Ответ

0 голосов
/ 07 апреля 2020

Что ж, если вы знаете, что ожидаемое исключение, которое возвращается из этого вызова, является InvalidMediaTypeException, то вы просто создаете RestClientException и передаете его вызывающей стороне, которая вызывает pingJenkins. Тогда тот, кто использует ваш API, будет ожидать RestClientException. Поскольку это Spring Boot, вы даже можете использовать глобальный обработчик исключений , введите здесь описание ссылки , которое перехватит это исключение без необходимости.

public void callingMethod() {
    try {
        pingJenkins("http://www.jenkins-endpoint.com");
    } catch (RestClientException exception) {
        log.error("Could not connect to Jenkins", exception);
    } 
}

private String pingJenkins(String jenkinsEndpoint) {
    RestTemplate restTemplate = new RestTemplate();
    try{
        restTemplate.getForEntity(jenkinsEndpoint+"/login", String.class);
        return "OK";
    } catch (InvalidMediaTypeException exception) {
        throw new RestClientException("Pinging Jenkins failed: " + exception.getMessage());
    }

    return "DOWN";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...