繁体   English   中英

包装此异常的好方法是什么?

[英]What is a good way to wrap this exception?

我正在为我的 springboot 应用程序实现一个 HealthIndicator,它 ping Jenkins 的实例以检查它们是否启动。 我通过 ping ${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";
    }

我宁愿捕获一个特定的异常,但是如果 ping 一个已关闭的 Jenkins 实例会产生一个InvalidMediaTypeException ,它看起来有点令人困惑(即我希望有类似RestClientException等的东西)。 什么是捕获/处理此异常的好方法? 我应该改为捕获RuntimeException吗?

好吧,如果知道从该调用返回的预期异常是InvalidMediaTypeException ,那么您只需创建一个RestClientException并将其重新抛出给调用pingJenkins的调用者。 然后,任何使用您的 API 的人都会期望出现RestClientException 由于这是 Spring 引导,您甚至可以使用全局异常处理程序在此处输入链接描述,这将在您不需要的情况下捕获该异常。

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";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM