我想知道如何处理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
来处理异常?
答案 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,
}
任何其他例外都不会被抓住