Я использую scanamo для запроса таблицы Dynamodb. Я хочу создать метод проверки работоспособности, который будет возвращать истину, пока динамо-машина можно сканировать (мне все равно, есть ли записи в таблице, я просто хочу знать, что таблица есть и ее можно сканировать). И я хочу, чтобы возвращалось 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)
}
}
это кажется более скалистым, но всегда возвращает истину:
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)
}
}
}





Проголосовать за "скалярный"