Как сделать: попробуйте {блок кода} для продолжительности X и перехватите {исключения, такие как тайм-аут}?

#scala #exception-handling #timeout #try-catch

#scala #обработка исключений #тайм-аут #попробуйте-поймайте

Вопрос:

Хорошо, заголовок немного неясен, так как я не был уверен, как его сформулировать, но по сути я пытаюсь выполнить оператор try-catch, который будет тайм-аут… Вот некоторый псевдокод, который может помочь описать то, что я пытаюсь сделать:

 try (10 seconds) {
  *make some connection and do some things*
} catch {
  case ex1: TimeoutException => *do something*
  case ex2: Exception => *do something else*
}
 

В настоящее время в оборудовании, с которым я работаю, есть ошибка, из-за которой запрос на подключение никогда не получает ответ, поэтому он просто сидит там и не улавливает никаких исключений. Поскольку это всего лишь ошибка (которая должна быть временной), я не хочу манипулировать архитектурой приложения (в частности, я не хочу создавать нового участника только для учета чего-то небольшого), и было бы идеально, если бы я мог реализовать этот псевдокод в рамкахкласс.

Итак, по сути, мой вопрос заключается в том, как мне реализовать приведенный выше псевдокод в рамках класса, в котором он находится?

Дайте мне знать, если что-то неясно! Спасибо!

Ответ №1:

Попробуйте:

 import scala.concurrent._
import ExecutionContext.Implicits.global

val f = future {
    // make some connection and do some things
}
try {
    Await.result(f, 10 seconds);
} catch {
    case e: TimeoutException => // do something
    case _ => // do something else
}
 

Дополнительная информация: фьючерсы и обещания

Комментарии:

1. Обратите внимание, что future{} это устарело в Scala 2.11 и заменено на Future{} .

2. Это правда! Я еще не переключился, хотя 🙂

3. Я получаю странную ошибку компиляции, указывающую на первую фигурную скобку после того, как Future говорит: «Не удается найти неявный ExecutionContext, либо требуйте его самостоятельно, либо импортируйте выполнение. Implicits.global» и я понятия не имею, что это значит, но я чувствую, что я не должен просто случайно импортировать что-то… Редактировать: @Vakh