如何处理Monix Onerrorhandle中未经手的异常



我正在使用monix任务,我正在尝试捕获可抛出的功能,然后转换为自定义错误。我已将代码删除/更改为简单且相关。这是代码(在代码段之后遵循问题):

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:

val localPackage = for {
  failfast <- 1 / 0
} yield failfast

我想你是指 Task.eval(1 / 0)

onErrorHandle也没有Task作为返回类型,您可能正在考虑onErrorHandleWith。给它一个部分函数是一个非常糟糕的主意(即,由于匹配错误而可能会引发异常的功能) - 如果您想匹配该错误,那么更好的替代方案是onErrorRecoveronErrorRecoverWith,将部分函数作为参数。

所以这里有一个样本:

import monix.eval._
import monix.execution.Scheduler.Implicits.global
val task = Task.eval(1 / 0).onErrorRecoverWith {
  case _: ArithmeticException => Task.now(Int.MinValue)
}
task.runAsync.foreach(println)
//=> -2147483648

希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新