Получить значение параметра или создать исключение


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

def foo() : String = {
  val x : Option[String] = ...
  x.getOrException()
}
5 61

5 ответов:

(EDIT: это не самый лучший или самый идиоматический способ сделать это. Я написал его, когда не был знаком со Скала. Я оставляю его здесь для примера, как не сделать это. В настоящее время я бы сделал как @TravisBrown)

Я думаю, что это действительно сводится к двум вещам:

  • как обязательно вы что, ценность есть?
  • как хочешь реагировать если это не так?

если в этой точке ваш код ожидал значение, чтобы быть там, и в случае, что это не вы хотите, чтобы ваша программа fail быстро, тогда я бы сделал только нормальный get и пусть Скала кинуть NoSuchElementException если не было никакого значения:

def foo() : String = {
  val x : Option[String] = ...
  x.get
}

если вы хотите вести дела по-другому (бросить свое собственное исключение) я думаю, что более изящно будет выглядеть так:

def foo(): String = {
  val x: Option[String] = None
  x match {
    case Some(value) => value
    case None => throw new MyRuntimeException("blah")
  }
} 

и конечно, если вы хотите поставить свой собственный альтернативное значение для дела что за Option и None вы бы просто использовать getOrElse:

def foo(): String = {
  val x: Option[String] = None
  x.getOrElse("my alternative value")
} 

A throw "оператор" - это действительно выражение в Scala, и оно имеет тип Nothing, который является подтипом любого другого типа. Это означает, что вы можете просто использовать обычный старый getOrElse:

def myGet[A](oa: Option[A]) = oa.getOrElse(throw new RuntimeException("Can't."))

вы действительно, действительно не должны делать этого, хотя.

просто использовать .метод get.

def get[T](o:Option[T]) = o.get

он вызовет исключение NoSuchElementException, если o является экземпляром None.

в принципе, я бы работал с такими вариантами:

def addPrint(oi:Option[Int]) = oi.map(_+1).foreach(println)
addPrint(Some(41))
addPrint(Some(1336))
addPrint(None)

чтобы избежать вашего конкретного вопроса.

Я думаю, что это поможет вам остаться на "функциональную" сторону :)

TL; DR

  • бросить Exception сигнализировать о неожиданном сбое в чисто функциональном коде.
  • использовать Option для возврата дополнительных значений.
  • использовать Option(possiblyNull) чтобы избежать случаев Some(null).
  • использовать Either сообщить об ожидаемом сбое.
  • использовать Try, а не Either вернуться исключения.
  • использовать Try а не блок catch для обработки непредвиденная ошибка.
  • использовать Try при работе с Future.
  • разоблачение Try в общедоступном API имеет аналогичный эффект в качестве проверенного исключения. Вместо этого рассмотрите возможность использования исключений.

о Either и Try

Scala теперь поддерживает эту операцию на картах с помощью getOrElse() метод, см. документации

Как уже отмечалось, выбрасывание исключения в Scala также является выражением.

таким образом, вы можете сделать следующее:

myMap.getOrElse(myKey, throw new MyCustomException("Custom Message HERE")