【发布时间】:2022-01-24 05:06:55
【问题描述】:
我有一个对象列表,对于每个对象,我需要使用 RestTemplate 访问外部 API。为此,我将 for 循环与 try-catch 块一起使用。如果外部 API 确实以 4xx、5xx 状态代码响应,我需要创建错误列表并抛出自定义异常,该异常使用异常处理程序处理以发送客户端友好的消息,这些消息也会发送电子邮件通知。要求是删除 try-catch 块并在循环中命中外部 API 并创建错误列表并检查错误列表是否不为空抛出异常并使用电子邮件通知一次发送所有错误消息异常处理方法handleApplicationErrors。但我相信当任何异常发生时 for 循环将是一个中断,如果没有 try-catch 块,我将无法创建错误消息列表,有什么可能的方法吗?
public void method() {
List<Objects> objects = fetchObjects();
List<String> errorList = new ArrayList();
for(int i=0;i<objects.size();i++) {
try{
hitExternalApi(object)
}
catch(Exception e){
errorList.add("Error Message")
}
}
if(!errorList.isEmpty()) {
throw new ErrorDTO(Status.BAD_REQUEST, errorList);
}
}
@Override
public void hitExternalApi(Object object) {
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> request = new HttpEntity<>(object, httpHeaders);
restTemplate.exchange(url, HttpMethod.POST, request, Void.class);
}
@ExceptionHandler(ErrorDTO.class)
public ResponseEntity<Problem> handleApplicationErrors(NativeWebRequest request, ErrorDTO error) {
notificationService.sendNotification(error.getErrors());
Problem problem =
Problem.builder()
.withStatus(error.getStatus())
.withTitle(error.getMessage())
.withDetail(error.getErrors().toString())
.build();
return create(error, problem, request);
}
【问题讨论】:
-
'hitExternalApi' 方法是什么样的?您需要在此方法中添加功能以在 response.getStatusCode() 不是 2xx(成功的 http 代码)时抛出异常。
-
你好@ProgrammerBoy,这是一个正常的rest模板交换方法调用,没有任何try-catch块。如果我在此方法中抛出异常,我将无法创建错误消息列表并为其发送单个通知。
-
您还应该检查
exchange返回的 ResponseEntity 的状态代码。但是为什么你说你需要删除 try-catch 块呢?有必要处理hitExternalApi抛出的任何异常。 -
是的,我可以使用状态码并基于 for 循环或方法中的 try-catch 块来管理它。但是团队中的一位成员建议删除 try-catch 块,并为我们发送到外部 API 的所有对象创建错误消息列表,并与整个列表一起发送电子邮件。所以我很想知道是否可以在不使用 try-catch 块的情况下做同样的事情。如果我删除 try-catch 并根据响应状态代码执行此操作,它将抛出 4xx、5xx 的异常,并且无法为循环中的所有对象创建错误消息列表。
标签: java spring spring-boot exception