我正在使用CompletableFuture并遇到以下用例:
public void someFunction () {
CompletableFuture.runAsync(() -> computations())
.exceptionally((err) -> {
log.info(err "");
return null;
});
}
public void computations() {
list.stream.forEach(() -> otherFunction());
}
public void otherFunction() {
//computations which can throw some error
}
正如您在此處看到的,我可以輕松地log在exceptionally塊中出錯,但是如果我不希望我的程式停止并繼續,直到list迭代了 的所有元素,該怎么辦。如果有錯誤,我想記錄錯誤并繼續下一個而不是停止應用程式。
uj5u.com熱心網友回復:
您可以嘗試捕獲可以拋出例外的代碼,如下所示:直接為每個專案處理例外而不阻塞 forEach 回圈
public void otherFunction() {
try {
//computations which can throw some error
} catch (Exception e) {
// Log and handle error without blocking analysis for following items
}
}
如果您已經知道 otherFunction 可以拋出什么例外,您可以顯式地只捕獲該例外,并將例外作為一個系統來處理其他例外。
uj5u.com熱心網友回復:
如果你想快取確切的例外并在以后處理它,你也可以做這樣的事情(注意這只會拋出串列迭代拋出的最后一個例外):
public void someFunction () {
CompletableFuture.runAsync(() -> {
try {
computations();
} catch (Exception e) {
e.printStackTrace();
}
});
}
public void computations() throws Exception {
AtomicReference<Exception> exception = new AtomicReference<>();
list.forEach(() -> {
try {
otherFunction();
} catch (Exception e) {
exception.set(e);
}
});
if (exception.get() != null)
throw exception.get();
}
public void otherFunction() throws Exception {
throw new Exception();
}
或者,如果您想快取所有例外:
public void someFunction () {
CompletableFuture.runAsync(() -> {
List<Exception> exceptions = computations();
exceptions.forEach(Throwable::printStackTrace);
});
}
public List<Exception> computations() {
final List<Exception> exceptions = new ArrayList<>();
list.forEach(() -> {
try {
otherFunction();
} catch (Exception e) {
exceptions.add(e);
}
});
return exceptions;
}
public void otherFunction() throws Exception {
throw new Exception();
}
uj5u.com熱心網友回復:
在使用 CompletableFuture 撰寫代碼時,例外處理可以發揮重要作用。IncompleteFuture 提供了三種方法來處理它們:handle()、whenComplete() 和 exceptionly()。如果您沒有使用 API 的經驗,您很容易迷失方向,因為它們看起來非常相似。以下部分解釋了它們之間的差異,并幫助您確定最適合您的情況的選項。我的目標是詳細描述每個 API,然后比較它們的用法,最后提供一些每個 API 最有用的示例。盡管這些資訊是用 Java 11 撰寫的,但在 Java 8 中應該仍然熟悉這些概念。讓我們開始吧。
handle:通過將當前完整未來的結果和例外傳遞給方法handle(),可以將當前結果轉換為另一個結果或檢索例外。給定“Oops”作為例外,我們可以使用handle()來處理結果和例外,要么從例外中恢復,要么直接回傳訊息。
結果在方法exception()中不可用。您可以改為訪問例外。由于該方法是專門為處理例外而命名的,因此該方法僅用于處理這些情況。如果可完成的未來成功實作,“例外”中的邏輯將被跳過。當失敗的未來回傳例外“Oops”時,我們可以利用例外從失敗中恢復。
此結果將包含在完整的未來 cf1 中:
下一個示例顯示如何在執行期間跳過命令。當成功時,未來回傳 OK。添加另一個處理例外的階段時,不會執行邏輯。如果完整的未來是 CF1,它將簡單地回傳與 CF0 相同的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/349032.html
標籤:爪哇 弹簧靴 rx-java 反应式编程 可完成的未来
