Monixタスクを使用していますが、Throwableをキャッチしてカスタムエラーに変換しようとしています。私はシンプルで関連性のあるコードを削除/変更しました。これは、(質問はコードスニペットの後に以下の)コードです:未処理の例外を処理する方法monix onErrorHandle
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) => ???
}
}
}
私はprint文を見ることができていますが、予想Task.now(Response(...
が返されていません。代わりに、ハンドラメソッドを呼び出すメソッドがエラーをスローしています。 Task[Response]
を返品するにはどうすればよいですか?
成功例が機能し、失敗例は機能しません。
編集#1:スカラーコードでエラーを修正します。
編集#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
の値がどのように失敗タスクで破棄されているのか理解していました。