developer tip

옵션 값 가져 오기 또는 예외 발생

copycodes 2020. 10. 31. 09:49
반응형

옵션 값 가져 오기 또는 예외 발생


옵션이 주어지면 값을 얻거나 예외를 던지는 관용적 방법은 무엇입니까?

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

(편집 : 이것은 그것을하는 가장 좋은 또는 가장 관용적 인 방법이 아닙니다. Scala에 익숙하지 않았을 때 썼습니다. 어떻게 하지 않는지 에 대한 예를 여기에 남겨 둡니다 . 요즘 나는 @TravisBrown으로 할 것입니다)

저는 이것이 두 가지로 귀결된다고 생각합니다.

  • 가치가 있다는 것을 얼마나 확신 하십니까?
  • 그렇지 않다면 어떻게 반응 하고 싶 습니까?

코드의 그 시점에서 값이있을 것으로 예상 하고 원격의 경우 프로그램이 빠르게 실패하는 것을 원하지 않는 경우 에는 정상 만 수행하고 값이 없으면 getScala 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에 노출 하면 확인 된 예외와 유사한 효과가 있습니다. 대신 예외 사용을 고려하십시오.

정보 EitherTry


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

반응형