我有一个使用tapir sttp.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],我应该如何修复这段代码,以返回我的自定义错误,取决于状态代码,以及在一切正常时正确的响应?
发布于 2022-11-30 16:32:57
我想你在“无话可说”一案中遇到了这个问题:
case _ => ZIO.fromEither(res.body).orDiefromEither正在返回一些IO[E, A],我的假设是,E是您遇到Throwable的地方。声明类型的Explicity应该修复它:fromEither[MyError, MyResponse]。
如果添加这些类型是不可能的,那么可以使用orDie代替refineOrDie { case e: MyError => e }。
https://stackoverflow.com/questions/74627672
复制相似问题