수색…


시험

map , getOrElseflatMap 사용하여 Try :

import scala.util.Try

val i = Try("123".toInt)     // Success(123)
i.map(_ + 1).getOrElse(321)  // 124

val j = Try("abc".toInt)     // Failure(java.lang.NumberFormatException)
j.map(_ + 1).getOrElse(321)  // 321

Try("123".toInt) flatMap { i =>
  Try("234".toInt)
    .map(_ + i)
}                            // Success(357)

패턴 일치로 Try 하기 :

Try(parsePerson("John Doe")) match {
    case Success(person) => println(person.surname)
    case Failure(ex) => // Handle error ...
}

어느 한 쪽

오류 / 성공에 대한 다른 데이터 유형

def getPersonFromWebService(url: String): Either[String, Person] = {
    
    val response = webServiceClient.get(url)

    response.webService.status match {
        case 200 => {
            val person = parsePerson(response)
            if(!isValid(person)) Left("Validation failed")
            else Right(person)
        }

        case _ => Left(s"Request failed with error code $response.status")
    }
}

양쪽 값에서의 패턴 매칭

getPersonFromWebService("http://some-webservice.com/person") match {
    case Left(errorMessage) => println(errorMessage)
    case Right(person) => println(person.surname)
}

어느 값이든 옵션으로 변환

val maybePerson: Option[Person] = getPersonFromWebService("http://some-webservice.com/person").right.toOption

선택권

의 사용은 null 값을 강하게 기대하고 기존의 자바 코드와 상호 작용하지 않는 한 권장되지 null . 대신, 함수의 결과가 무언가 ( Some ) 또는 무효 ( None ) 일 때 Option 사용해야합니다.

try-catch 블록은 오류 처리에 더 적합하지만 함수가 합법적으로 아무 것도 반환하지 않으면 Option 이 사용하기 쉽고 간단합니다.

Option[T]Some(value) ( T 타입의 값을 포함)이거나 None :

def findPerson(name: String): Option[Person]

사람을 찾을 수 없으면 None 을 반환 할 수 있습니다. 그렇지 않으면, Person 오브젝트를 포함하는 Some 유형의 오브젝트가 리턴됩니다. 다음은 Option 유형의 객체를 처리하는 방법입니다.

패턴 매칭

findPerson(personName) match {
    case Some(person) => println(person.surname)
    case None => println(s"No person found with name $personName")
}

mapgetOrElse 사용

val name = findPerson(personName).map(_.firstName).getOrElse("Unknown")
println(name) // Prints either the name of the found person or "Unknown"

폴드 사용

val name = findPerson(personName).fold("Unknown")(_.firstName)
// equivalent to the map getOrElse example above.

Java로 변환

상호 운용성을 위해 Option 유형을 null 가능 Java 유형으로 변환해야하는 경우 :

val s: Option[String] = Option("hello")
s.orNull           // "hello": String
s.getOrElse(null)  // "hello": String

val n: Option[Int] = Option(42)
n.orNull           // compilation failure (Cannot prove that Null <:< Int.)
n.getOrElse(null)  // 42

선물에서 발생하는 오류 처리

Future 내에서 exception 가 발생하면이를 사용하여 recover 를 수행 recover 수 있습니다.

예를 들어,

def runFuture: Future = Future { throw new FairlyStupidException }

val itWillBeAwesome: Future = runFuture

... Future 에서 Exception 를 던질 것입니다. 그러나 우리는 FairlyStupidException 유형의 Exception 이 높은 확률로 예측할 수 FairlyStupidException 케이스를 우아한 방식으로 구체적으로 처리 할 수 ​​있습니다.

val itWillBeAwesomeOrIllRecover = runFuture recover { 
    case stupid: FairlyStupidException => 
         BadRequest("Another stupid exception!") 
}

당신에게 주어진 방법 볼 수 있듯이 recover A는 PartialFunction 모두의 도메인에 Throwable 당신은 단지 특정 몇 가지 유형을 처리하고 나머지는 더 높은 수준에서 예외 처리의 에테르로 이동하게 할 수 있도록, Future 스택입니다.

이는 비 Future 컨텍스트에서 다음 코드를 실행하는 것과 유사합니다.

def runNotFuture: Unit = throw new FairlyStupidException

try {
    runNotFuture
} catch {
    case e: FairlyStupidException => BadRequest("Another stupid exception!")
}

훨씬 더 교활하기 때문에 Future 내에서 생성 된 예외를 처리하는 것은 정말로 중요합니다. 그들은 다른 실행 컨텍스트와 스레드에서 실행되기 때문에 일반적으로 얼굴 전체에 나타나지 않습니다. 따라서 로그 나 이벤트에서 아무 것도 눈치 채지 못하면 문제를 해결할 것을 요구하지 않습니다. 신청.

try-catch 절 사용

등의 기능 구조에 더하여 Try , OptionEither 오류 처리를위한 스칼라도 (결국뿐만 아니라 차단 잠재적으로) 시도 - 캐치 절을 사용하여, 자바와 유사한 구문을 지원합니다. catch 절은 패턴 일치입니다.

try { 
  // ... might throw exception
} catch {
  case ioe: IOException => ... // more specific cases first
  case e: Exception => ...
  // uncaught types will be thrown
} finally {
  // ...
}

예외를 Either 또는 Option 유형으로 변환

예외를 Either 또는 Option 유형으로 변환하려면 scala.util.control.Exception 에서 제공하는 메소드를 사용할 수 있습니다.

import scala.util.control.Exception._

val plain = "71a"
val optionInt: Option[Int] = catching(classOf[java.lang.NumberFormatException]) opt { plain.toInt }
val eitherInt = Either[Throwable, Int] = catching(classOf[java.lang.NumberFormatException]) either { plain.toInt }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow