处理 ResponsesEntity 中的异常 java

Handle Exception in ResponsesEntity java

我想知道如何处理 ResponsesEntity 中的异常。 当它收到错误的 url 时,它应该转到 catch 块并显示 log。但是我不断在控制台中收到错误消息。 try-catch 不工作,因为它不显示日志消息。

@GetMapping("abc/{Id}")
    public ResponseEntity info(@PathVariable("Id") String id) {
        HttpEntity httpEntity = new HttpEntity(buildHttpHeaders());
        String theUrl = url + "/xxx/transactions/" +id;
        ResponseEntity<TDto> responseEntity = restTemplate.exchange(theUrl, HttpMethod.GET, httpEntity, TDto.class);
        TDto tdto = responseEntity.getBody();
        Tran tran = new Tran();
        try {
              tran.setDate(new Date());
              tran.saveAndFlush(tran); // save to database
        }catch(Exception e)
        {
            log.info("Log: "+e);
        }
        return responseEntity;
    }

错误

org.springframework.web.client.HttpClientErrorException: 404 Not Found
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:531)
    at com.rh.tranglo.controller.ApiController.retrieveTransactionInfo(ApiController.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)

有没有办法通过在 catch 块中显示 log 来处理异常?

尝试在捕获中指定从控制台得到的确切错误,也就是 HttpClientErrorException

您实际上并没有在 try-catch 中包含 responseEntity。 try-catch 将只捕获 try 中的异常 { // 将捕获括号之间的所有异常 }

@GetMapping("abc/{Id}")
public ResponseEntity info(@PathVariable("Id") String id) {
try {
    HttpEntity httpEntity = new HttpEntity(buildHttpHeaders());

    String theUrl = url + "/xxx/transactions/" +id;
    ResponseEntity<TDto> responseEntity = restTemplate.exchange(theUrl, 
    HttpMethod.GET, httpEntity, TDto.class);
    TDto tdto = responseEntity.getBody();
    Tran tran = new Tran();

          tran.setDate(new Date());
          tran.saveAndFlush(tran); // save to database
     }catch(Exception e)
    {
        log.info("Log: "+e);
    }
    return responseEntity;
}

如果你想捕获来自 responseEntity 的抛出,它应该看起来更像这样,但在你的情况下,只会捕获由这个抛出的异常:

try {
          tran.setDate(new Date()); -> this will throw exceptions(very unlikely)
          tran.saveAndFlush(tran); -> or this will throw exceptions, 
    }

并且不会捕获任何其他异常

如果您的 catch 块没有捕获异常,则意味着您在 try 块中包装了错误的代码。要知道实际上是哪个代码抛出异常,我建议您在代码中放置断点并通过调试器 运行 断点。我不熟悉你想要实现的目标但是看着它我猜你应该在 try 块中包装的语句是这个

ResponseEntity<TDto> responseEntity = restTemplate.exchange(theUrl, HttpMethod.GET, httpEntity, TDto.class);

此外,如果您再次仔细查看日志,您会发现对您有所帮助的内容。异常源自您的代码,但排名靠前的异常只是 spring 异常。我想如果您按照日志消息向下看,您会在代码中看到抛出异常的行。

更新

我想我现在明白你的问题了。但是你的问题没有被正确地问到。你有一个映射到特定 URL 的控制器说 /hello 但在测试时你通过 /hi 并且你希望你的控制器方法捕获未找到的异常。抱歉 spring 不能那样工作。

当控制器映射到 URL 时,仅当调用中使用的 URL 与控制器映射到的 URL 匹配时,才会执行控制器代码。因此,在您的情况下,当您使用控制器映射到的另一个 URL 进行 GET 时,控制器中的代码将永远不会执行。这就是为什么你不进入你放置的 catch 块。 Spring 代码负责抛出 404 异常,而不是您的代码。

注意当我正确理解您的问题后,我将能够为您提供更多帮助。如果您能分享完整的堆栈跟踪信息,那将大有裨益。