Получить значение параметра или создать исключение
учитывая вариант, каков идиоматический способ получить его значение или бросить попытку исключения?
def foo() : String = {
val x : Option[String] = ...
x.getOrException()
}
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 имеет аналогичный эффект в качестве проверенного исключения. Вместо этого рассмотрите возможность использования исключений.
Scala теперь поддерживает эту операцию на картах с помощью
getOrElse()
метод, см. документацииКак уже отмечалось, выбрасывание исключения в Scala также является выражением.
таким образом, вы можете сделать следующее:
myMap.getOrElse(myKey, throw new MyCustomException("Custom Message HERE")