Scala,ZIO -如何从ZIO返回自定义错误

izkcnapc  于 2022-12-04  发布在  Scala
关注(0)|答案(1)|浏览(156)

我有一个简单的代码,其中使用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。我尝试了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]我应该如何修复这个代码返回我的自定义错误取决于状态代码和正确的响应时,一切正常?

nhn9ugyo

nhn9ugyo1#

我想你在“全面”案例中遇到了这个问题:

case _ => ZIO.fromEither(res.body).orDie

fromEither返回了一些IO[E, A],我的假设是E是你运行到Throwable的地方。显式声明类型应该可以修复它:fromEither[MyError, MyResponse] .
如果显式添加类型是不可能的,那么可以使用refineOrDie { case e: MyError => e },而不是使用orDie

相关问题