我有一个简单的代码,其中使用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
。我尝试了smth,如下所示:
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]
我应该如何修复这个代码返回我的自定义错误取决于状态代码和正确的响应时,一切正常?
1条答案
按热度按时间nhn9ugyo1#
我想你在“全面”案例中遇到了这个问题:
fromEither
返回了一些IO[E, A]
,我的假设是E
是你运行到Throwable
的地方。显式声明类型应该可以修复它:fromEither[MyError, MyResponse]
.如果显式添加类型是不可能的,那么可以使用
refineOrDie { case e: MyError => e }
,而不是使用orDie
。