在scala中捕获scanamo错误

时间:2018-12-19 19:21:04

标签: scala

我正在使用scanamo来查询一个dynamodb表。 我想创建一个运行状况检查方法,只要可以扫描dynamo,该方法将返回true(我不在乎表中是否有记录,我只想知道表在那里并且可以被扫描)。而且我希望如果表不存在则返回false(我将表名作为测试的结果)。 这是我现在拥有的scala代码:

trait DynamoTestTrait extends AbstractDynamoConfig {
  def test(): Future[List[Either[DynamoReadError, T]]] =
    ScanamoAsync.exec(client)(table.consistently.limit(1).scan())
}

,并且在存在该表时有效:

val r = reg.test()
  .map(
    _.headOption.forall(_.isRight)
  )
val e = Await.result(r, scala.concurrent.duration.Duration(5, "seconds"))

但是当表名不正确时,我会遇到意外错误:

Unexpected server error: 'Cannot do operations on a non-existent table (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ResourceNotFoundException;

我会以为我把这个错误困在了我的左手边。 如何捕获此错误? scala是否可以使用try / catch构造?

我也尝试过这种方法,但是错误仍然被抛出,似乎不是我的抓住:

trait DynamoTestTrait extends AbstractDynamoConfig {
  def test(): Future[Boolean] =
    try {
      ScanamoAsync
        .exec(client)(table.consistently.limit(1).scan())
        .map(
          _.headOption.forall(_.isRight)
        )
    } catch {
      case e: ResourceNotFoundException => Future.successful(false)
    }
}

这似乎更容易理解,但总是返回true:

trait DynamoTestTrait extends AbstractDynamoConfig {
  def test: Future[Boolean] = {
    val result = Try(ScanamoAsync
      .exec(client)(table.consistently.limit(1).scan())
      .map(
        _.headOption.forall(_.isRight)
      ))
    result match{
      case Success(v) => Future.successful(true)
      case Failure(e) => Future.successful(false)
    }
  }
}

0 个答案:

没有答案