2

我创建了错误层次结构:

sealed trait MyError extends Throwable
final case class SecondError(msg: String) extends MyError

现在我的http4s路线中可能会出现这种错误:

case GET -> Root / "things" => for {
        response <- things.all.foldM(
          error => error match {
            case SecondError(_) => InternalServerError(error)            
          }
...

但我得到编译错误:

could not find implicit value for parameter encoder: io.circe.Encoder[Throwable]

Throwable是否可以使用circeand进行编码http4s?我试着这样做:

implicit def encoderHttpThrowable: EntityEncoder[Env, Throwable] = jsonEncoderOf[Env, Throwable]

但这并没有解决问题。

4

1 回答 1

1

不可能使用Circe(或任何其他库)自动编码 Java Hierarchy(我很确定这一点)。

所以你有3种可能性:

  1. 只需使用错误消息:

    case GET -> Root / "things"  =>
        things.all.foldM (
          error => InternalServerError(error.getMessage()),
          Ok(_)
        )
    
  2. 或者摆脱 Throwable:

      sealed trait MyError
      final case class SecondError(msg: String) extends MyError
    

    现在您可以对错误进行编码

    ...
    case GET -> Root / "things"  =>
      things.all.foldM (
        error => InternalServerError(error),
        Ok(_)
      )
    
  3. 将您的 Throwable 映射到您自己的错误(没有 Throwable 的密封特征):

    ...
    case GET -> Root / "things"  =>
      things.all
        .mapError{
          case ex: IllegalArgumentException => SecondError(ex.getMessage)
          case ex => FirstError(ex.getMessage)
       }
        .foldM (
        error => InternalServerError(error),
        Ok(_)
      )
    
于 2020-01-16T18:58:24.603 回答