我有一個物件串列,對于每個物件,我需要使用 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);
}
uj5u.com熱心網友回復:
您可以將 for 回圈放在函式中,并在呼叫該函式后呼叫例外。
請參考以下示例以更好地理解:
前
public class ExceptionInLoop{
public static void sampleMethod(){
String str[] = {"Mango", "Apple", "Banana", "Grapes", "Oranges"};
try {
for(int i=0; i<=10; i ) {
System.out.println(str[i]);
System.out.println(i);
}
}catch (ArrayIndexOutOfBoundsException ex){
System.out.println("Exception occurred");
}
System.out.println("hello");
}
public static void main(String args[]) {
sampleMethod();
}}
后
public class ExceptionInLoop{
public static void print(String str) {
System.out.println(str);
}
public static void sampleMethod()throws ArrayIndexOutOfBoundsException {
String str[] = {"Mango", "Apple", "Banana", "Grapes", "Oranges"};
for(int i=0; i<=10; i ) {
try {
print(str[i]);
System.out.println(i);
} catch(Exception e){
System.out.println(i);
}
}
}
public static void main(String args[]) {
try{
sampleMethod();
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("");
}
}}
uj5u.com熱心網友回復:
您應該能夠通過將 try-catch 塊向下移動到hitExternalApi方法來解決您的要求,如果您需要傳遞任何資訊,則讓它回傳一個布林值或 DTO。for 回圈然后可以只檢查回傳值hitExternalApi并在errorList需要時填充。修改后的代碼示例:
public void method() {
List<Objects> objects = fetchObjects();
List<String> errorList = new ArrayList();
for (int i = 0; i < objects.size(); i ) {
if (!hitExternalApi(object)) {
errorList.add("Error Message");
}
}
if (!errorList.isEmpty()) {
throw new ErrorDTO(Status.BAD_REQUEST, errorList);
}
}
public boolean hitExternalApi(Object object) {
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> request = new HttpEntity<>(object, httpHeaders);
try {
restTemplate.setErrorHandler();
restTemplate.exchange(url, HttpMethod.POST, request, Void.class);
return true;
} catch (Exception exception) {
return false;
}
}
默認情況下,(因此在使用 時DefaultResponseErrorHandler), 的呼叫restTemplate.exchange(...)將拋出某種RestClientException4xx 和 5xx 回應,因此您需要在某處處理此例外或提供您自己的ResponseErrorHandler并圍繞該例外構建邏輯。
uj5u.com熱心網友回復:
您可以創建一個額外的物件來控制流程
public class ApiResponsePojo {
private HttpStatus status;
private String message;
private String data;
}
您可以使用這樣的類并將其修改為您想要存盤訊息的方式。您可以通過狀態檢查是否有任何錯誤并在狀態中填充一條訊息
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/393657.html
上一篇:回傳兩種不同型別的函式
下一篇:計算機組成原理(復習)
