我正在使用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)
}
}
}