gpt4 book ai didi

kotlin - 在 Kotlin 中使用 Kovenant Promise.of(value) 时,有时我会泄漏异常

转载 作者:行者123 更新时间:2023-12-02 12:49:29 25 4
gpt4 key购买 nike

使用 Kovenant,我使用 Promise.of(value)有时会创建一个同步结果,我想将其包装为一个 promise 。但有时调用如下:

Promise.of(callSomeCalculation())  <-- throws exception sometimes
.then { ... }
.then { ... }
.fail { ex -> log.error(ex) } <-- exception is not logged
此代码丢失了第一个 promise 期间发生的异常。他们去哪儿了?他们从不被记录。有时他们只是让我的应用程序因未处理的异常而崩溃。为什么 promise 没有捕获他们?
注:这个问题是作者有意编写和回答的( Self-Answered Questions),以便在 SO 中共享有趣问题的解决方案。

最佳答案

问题是你在你的 promise 链之外泄露了异常。想象一下这段代码:

fun makeMyPromise(): Promise<Int, Exception> {
val result: Int = callSomeCalculation() // <--- exception occurs here
val deferred = deferred<Int, Exception>()
deferred.resolve(result)
return deferred.promise
}

这基本上就是您的代码在第一行中所做的事情。如果抛出异常,该方法将退出并返回 deferred.reject永远不会被调用。将代码更改为:
fun makeMyPromise(): Promise<Int, Exception> {
val deferred = deferred<Int, Exception>()
try {
val result: Int = callSomeCalculation() // <--- exception occurs here
deferred.resolve(result)
} catch (ex: Exception) {
deferred.reject(ex)
}
return deferred.promise
}

会更正确并捕获你的异常(exception)。它确保不会从 promise 链中泄漏任何东西。

所以回到你原来的代码,你的 callSomeCalculation()发生在 Promise.of() 之前方法被调用,它无法提供这种保护。它发生在 Kovenant 有一个想法之前,你甚至正在创造一个 promise 。所以你需要一个新的 Promise.of(lambda)接受可以完全防止此类泄漏的代码块的方法。

这是一个新的 Promise.of(lambda)扩展功能:
fun <V> Promise.Companion.of(codeBlock: () -> V): Promise<V, Exception> {
val deferred = deferred<V, Exception>()
try {
deferred.resolve(codeBlock())
}
catch (ex: Exception) {
deferred.reject(ex)
}
return deferred.promise
}

这将用作:
Promise.of { callSomeCalculation() }   <-- sometimes throws exception
.then { ... }
.then { ... }
.fail { ex -> log.error(ex) } <-- exception ALWAYS logged!

注意括号 ()改为 {}括号,因为现在代码块被传递到 Promise.of方法并用异常处理包装,防止任何泄漏。您现在将看到您的异常记录在后面的 fail { .. } 中。堵塞。

关于kotlin - 在 Kotlin 中使用 Kovenant Promise.of(value) 时,有时我会泄漏异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39564968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com