옵션 값 가져 오기 또는 예외 발생
옵션이 주어지면 값을 얻거나 예외를 던지는 관용적 방법은 무엇입니까?
def foo() : String = {
val x : Option[String] = ...
x.getOrException()
}
(편집 : 이것은 그것을하는 가장 좋은 또는 가장 관용적 인 방법이 아닙니다. Scala에 익숙하지 않았을 때 썼습니다. 어떻게 하지 않는지 에 대한 예를 여기에 남겨 둡니다 . 요즘 나는 @TravisBrown으로 할 것입니다)
저는 이것이 두 가지로 귀결된다고 생각합니다.
- 가치가 있다는 것을 얼마나 확신 하십니까?
- 그렇지 않다면 어떻게 반응 하고 싶 습니까?
코드의 그 시점에서 값이있을 것으로 예상 하고 원격의 경우 프로그램이 빠르게 실패하는 것을 원하지 않는 경우 에는 정상 만 수행하고 값이 없으면 get
Scala NoSuchElementException
가 :
def foo () : 문자열 = { val x : 옵션 [문자열] = ... x.get }
케이스를 다르게 처리하고 싶다면 (자신의 예외를 던지고) 더 우아한 방법이 다음과 같이 보일 것이라고 생각합니다.
def foo () : 문자열 = { val x : 옵션 [문자열] = 없음 x 일치 { case Some (value) => value case None => throw new MyRuntimeException ( "blah") } }
그리고 물론 당신은 그 사건에 대한 자신의 다른 값을 제공하려는 경우 Option
입니다 None
당신은 그냥 사용합니다 getOrElse
:
def foo () : 문자열 = { val x : 옵션 [문자열] = 없음 x.getOrElse ( "내 대체 값") }
throw
"문은"정말 스칼라의 표현이며, 종류가 Nothing
다른 모든 유형의 하위 유형입니다. 이것은 당신이 평범한 오래된 것을 사용할 수 있음을 의미합니다 getOrElse
.
def myGet[A](oa: Option[A]) = oa.getOrElse(throw new RuntimeException("Can't."))
당신은 정말, 정말로 이것을해서는 안됩니다.
.get 메소드를 사용하십시오.
def get[T](o:Option[T]) = o.get
o가 None의 인스턴스이면 NoSuchElementException이 발생합니다.
기본적으로 다음과 같은 옵션으로 작업합니다.
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 now support this operation on maps using getOrElse()
method, see documentation here
As pointed out already, throwing an exception in Scala is an expression as well.
So you can do the following:
myMap.getOrElse(myKey, throw new MyCustomException("Custom Message HERE")
참고URL : https://stackoverflow.com/questions/16263560/get-option-value-or-throw-an-exception
'developer tip' 카테고리의 다른 글
BACKUP LOG TO DISK 후에도 로그 파일의 DBCC SHRINKFILE 크기가 줄어들지 않음 (0) | 2020.10.31 |
---|---|
Django Rest 프레임 워크 토큰 인증 (0) | 2020.10.31 |
golang지도를 통해 반복 (0) | 2020.10.30 |
CSS3 전환 : "전환 : 모두"가 "전환 : x"보다 느립니까? (0) | 2020.10.30 |
커밋 기록을 잃지 않고 SVN에서 GIT로 코드를 마이그레이션하는 방법은 무엇입니까? (0) | 2020.10.30 |