当前位置: 首页 > 知识库问答 >
问题:

恢复未来没有按预期响应(scala)

唐彬炳
2023-03-14

我有一个自定义案例类异常:

 case class RecordNotFoundException(msg: String) extends RuntimeException(msg)

在我的 dao 中,我有一个从数据库中提取对象的方法,该方法返回 future,如果此将来失败,我将抛出我的 RecordNotFoundException 异常:

  def getPerson(personId: String): Future[Person] = {
    val q = quote {
      query[Person].filter(per => per.personId == lift(personId))
    }
    ctx.run.map(_.head) recover {
      case ex: NoSuchElementException => throw RecordNotFoundException(s"personId $personId does not exist")
    }
  }

在另一个方法中,我调用getPerson方法,所以我将恢复添加到另一个方法中,当未来使用RecordNotFoundException失败时,我想返回一些东西:

def run(personDao: PersonDao): Future[String] = {
  if (true) {
    for {
      person <- personDao.getPerson("some_user_id")
      something <- someOtherFuture
    } yield {
      // what happens here not relevant
    }
  } else {
    Future.successful("got to the else")
  } recover {
    case e: RecordNotFoundException => "got to the recover"
  }
}

因此,基本上,我希望当getPerson失败时,run()方法返回“got to the recover”,但由于某些原因,我无法恢复…失败会返回到控制器。

有人知道为什么吗?

共有1个答案

阮阳曦
2023-03-14

首先看看您的< code>recover在哪里。为什么不把它移到方法的最后一行呢?类似于:

def getPerson(id: String): Future[String] = Future("Andy")
def someOtherFuture(id: String) = Future("Mandy")

case class RecordNotFoundException(msg: String) extends RuntimeException(msg)

def run(personDao: String): Future[String] = {
  if (true) 
    for {
      person <- getPerson("some_user_id")
      something <- someOtherFuture("1")
    } yield {
      person
    }
  else Future.successful("got to the else")
}recover { case e: RecordNotFoundException => "got to the recover"}

还要移动 getPerson恢复

在我看来,在模型和/或服务中使用Future/recover并没有错,然后异常又回到了控制器。然后控制器方法处理自定义异常;并将 InternalServerErrorBadRequest 返回给用户或 API 调用。

 类似资料:
  • 我正在通过解析器运行GraphQl变异。这是与Neo4j数据库的对比。该查询运行良好,但是我无法以在结果中显示的方式组织结果。我已经尝试了几种不同的结果和记录映射组合,但是我无法在输出中显示返回结果集的属性。 具体来说,在下面的示例中,您将看到响应中的name字段(通过GraphiQL)在我希望将其设置为返回值时为空。 解析器: GraphQL查询 输出: 相关架构部分

  • 我有元素,这些元素有一个绑定到复选框的语句。如果我物理地选中该复选框,将按预期响应。但是,如果我通过JavaScript选中或取消选中复选框,则复选框会按预期被选中或取消选中,但没有响应。这是正常工作吗?有没有更好的办法做到这一点? 下面是我的代码示例:“[]”=“<>” HTML-第1部分 [li id=“HomeButton”ng-if=“HomeChecked!=true”onclick=“

  • 我正在开发一个graqphqlapi,它通过Mongoose从MongoDB获取数据。现在我遇到的问题是GraphQL不使用查询来解析字段,而是使用字段解析程序,因为没有设置ID,所以字段解析程序无法工作。 TypeDefs: 解析程序: 功能: 查询: 结果:

  • 我目前正试图研究并发性,特别是“volatile”关键字。 通过声明计数器变量为volatile,所有对计数器变量的写入都将立即写回主存。此外,计数器变量的所有读取都将直接从主存中读取。下面是计数器变量的volatile声明的外观 和 当线程写入易失性变量时,不仅易失性变量本身会被写入主内存。此外,线程在写入易失性变量之前更改的所有其他变量也会刷新到主内存中。当一个线程读取一个易失性变量时,它还将

  • 我试图做一个简单的查询,从我的火还原数据库,但我错过了一些非常明显的东西。我试着在网上寻找,但没有什么工作。对于一些背景,我有一个“cf”集合,我试图查询一个“hsc”值等于“1”的对象,但我没有得到任何回报。 我正在通过邮递员测试这个。我试图改变firebase规则,使之适用于任何情况,但仍然没有任何效果。 更新:以下是我如何初始化我的数据库