#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