处理ResponsesEntity java中的异常

时间:2017-07-06 15:01:41

标签: java http response

我想知道如何处理ResponsesEntity中的异常。 如果收到错误的网址,则会设置转到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)

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

3 个答案:

答案 0 :(得分:2)

尝试在catch中指定从控制台获得的确切错误,aka-HttpClientErrorException

答案 1 :(得分:2)

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

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

此外,如果您再仔细查看日志,您会看到一些对您有帮助的内容。异常来自您的代码,但最常见的例外只是spring异常。我想如果你按照日志消息向下看,你会看到你的代码中抛出异常的行。

<强>更新

我想我现在明白你的问题。但你的问题没有被正确询问。你有一个映射到特定URL的控制器说/ hello但是在测试时你传递/ hi并且你希望你的控制器方法能够捕获未找到的异常。抱歉春天不会这样。

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

注意当我正确理解您的问题时,我会为您提供更多帮助。如果你可以共享完整的堆栈跟踪,那将会有很多好处。

答案 2 :(得分:1)

你没有在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, 
    }

任何其他例外都不会被抓住