【发布时间】:2017-11-19 23:06:38
【问题描述】:
我正在使用 monix 任务,我正在尝试捕获 Throwable,然后转换为自定义错误。我已将代码删除/更改为简单且相关。这是代码(代码sn-p之后的问题):
import io.netty.handler.codec.http.HttpRequest
import monix.reactive.Observable
import io.netty.buffer.ByteBuf
import monix.eval.Task
import com.mypackage.Response
private[this] def handler(
request: HttpRequest,
body: Observable[ByteBuf]
): Task[Response] = {
val localPackage = for {
failfast <- Task.eval(1 / 0)
} yield failfast
// Failure case.
localPackage.onErrorRecoverWith {
case ex: ArithmeticException =>
print(s"LOG HERE^^^^^^^^^^^^^^^")
return Task.now(
Response(HttpResponseStatus.BAD_REQUEST,
None,
None)
)
}.runAsync
// Success case.
localPackage.map { x =>
x match {
case Right(cool) =>
Response(
HttpResponseStatus.OK,
None,
cool
)
case Left(doesntmatter) => ???
}
}
}
我可以看到打印语句,但没有返回预期的Task.now(Response(...。相反,调用处理程序方法的方法会引发错误。我如何让它返回Task[Response]?
成功案例有效,失败案例无效。
编辑 #1:修复 scala 代码中的错误。
编辑 #2 这就是我修复它的方法。
// Success case.
localPackage.map { x =>
x match {
case Right(cool) =>
Response(
HttpResponseStatus.OK,
None,
cool
)
case Left(doesntmatter) => ???
}
}.onErrorRecoverWith {
case ex: ArithmeticException =>
print(s"LOG HERE^^^^^^^^^^^^^^^")
return Task.now(
Response(HttpResponseStatus.BAD_REQUEST,
None,
None)
)
}
我在考虑未来,忘记了lazy eval 任务的性质。此外,我了解 CancellableFuture 值是如何在失败任务中被丢弃的。
【问题讨论】:
标签: scala reactive-programming monix