【发布时间】:2022-12-01 00:52:58
【问题描述】:
我有一个使用tapirsttp.client3.json._的简单代码:
def method(...): Task[MyResponse] =
someLogic().response(asJson[MyResponse]).flatMap(res => ZIO.fromEither(res.body))
但现在我想在这里添加一些逻辑,以便在 asJson[MyResponse] 失败时使用自定义错误。
我创建了错误层次结构:
sealed trait MyError extends Throwable
case class MyFirstError (msg: String) extends MyError
case class MySecondError (msg: String) extends MyError
而且我将Task更改为IO[MyError, MyResponse],但我不知道当错误出现时我应该如何返回错误并在一切正常时返回相同的正确MyResponse。
我试过这样的:
def method(...): IO[MyError, MyResponse] =
someLogic().response(asJson[MyResponse]).flatMap{ res =>
res.code match {
case StatusCode.BadRequest => ZIO.fail(MyFristError("my error"))
case StatusCode.Forbidden => ZIO.fail(MySecondError("my other error"))
case _ => ZIO.fromEither(res.body).orDie
}
}
我在这里遇到错误Required IO[MyError, MyResponse], Found ZIO[Any, Throwable, MyResponse]
我应该如何修复此代码以返回我的自定义错误取决于状态代码并在一切正常时正确响应?
【问题讨论】:
-
我认为这个
someLogic().response(asJson[MyResponse])已经将错误通道设置为Throwable- 当您flatMap时,您计算之前的错误通道与flatMap中的错误通道之间的公共时间Throwable。在flatMapping 响应之前,您必须从ThrowablemapError到MyError(或死亡)。