作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Kovenant,我使用 Promise.of(value)
有时会创建一个同步结果,我想将其包装为一个 promise 。但有时调用如下:
Promise.of(callSomeCalculation()) <-- throws exception sometimes
.then { ... }
.then { ... }
.fail { ex -> log.error(ex) } <-- exception is not logged
此代码丢失了第一个 promise 期间发生的异常。他们去哪儿了?他们从不被记录。有时他们只是让我的应用程序因未处理的异常而崩溃。为什么 promise 没有捕获他们?
最佳答案
问题是你在你的 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
}
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/
当使用 Kotlin 中的 Kovenant 时,我最终得到了很多以下模式的代码: fun foo(): Promise { val deferred = deferred() try
使用 Kovenant,我使用 Promise.of(value)有时会创建一个同步结果,我想将其包装为一个 promise 。但有时调用如下: Promise.of(callSomeCalculat
我是一名优秀的程序员,十分优秀!