Skip to content

Instantly share code, notes, and snippets.

@j5ik2o
Last active February 21, 2019 00:57
Show Gist options
  • Save j5ik2o/5471851 to your computer and use it in GitHub Desktop.
Save j5ik2o/5471851 to your computer and use it in GitHub Desktop.
Tryの使い方

名前を与えると長さを返すメソッドがある。ただし、空文字列とaから始まる接頭辞を持たない場合は例外となる。

成功した時はSuccessにラップして返し、例外時はFailureでラップして返す。いずれもscala.util.Tryのサブ型である。

scala> import scala.util._
import scala.util._

scala> case class ZeroLengthException(name:String) extends Exception(s"$name is zeo length")
defined class ZeroLengthException

scala> case class PrefixInvalidException(name: String) extends Exception(s"$name's prefix is invalid")
defined class PrefixInvalidException

scala> def getNameLength(name: String): Try[Int] = Try{
     |   name match {
     |   case name if name.size == 0 =>  throw ZeroLengthException(name)
     |   case name if name.startsWith("a") == false => throw PrefixInvalidException(name)
     |   case name => name.size
     |   }
     | }
getNameLength: (name: String)scala.util.Try[Int]

getNameLengthメソッドを使って見る。

scala> getNameLength("")
res0: scala.util.Try[Int] = Failure(ZeroLengthException:  is zeo length)

scala> getNameLength("xbc")
res1: scala.util.Try[Int] = Failure(PrefixInvalidException: xbc's prefix is invalid)

scala> getNameLength("abc")
res2: scala.util.Try[Int] = Success(3)

getNameLengthメソッドによって得たTryを受け取って処理するメソッド。つまり文字列を表示するメソッドを考える。

とりあえずFailureの時はNothingという文字列にしてしまう。

scala> def showNameLength(nameLength: Try[Int]) =
     |   println("length = " + nameLength.map(_.toString).getOrElse("Nothing"))
showNameLength: (nameLength: scala.util.Try[Int])Unit

scala> showNameLength(getNameLength(""))
length = Nothing

scala> showNameLength(getNameLength("xbc"))
length = Nothing

scala> showNameLength(getNameLength("abc"))
length = 3

Failureにラップされた例外毎にリカバリ処理を考慮する。

scala> def showNameLength(nameLength: Try[Int]) = {
     |   val msg = nameLength.map{
     |      e => s"length = $e"
     |   }.recover{
     |     case ex: ZeroLengthException => "zero length"
     |     case ex: PrefixInvalidException => "prefix invalid"
     |   }.get
     |   println(s"length = $msg")
     | }
showNameLength: (nameLength: scala.util.Try[Int])Unit

使ってみる

scala> showNameLength(getNameLength(""))
length = zero length

scala> showNameLength(getNameLength("xbc"))
length = prefix invalid

scala> showNameLength(getNameLength("abc"))
length = length = 3

どういう時に使えるか、失敗する可能性がある処理の戻リ値として表現可能。呼び出し元のどこかで例外時のケースの処理を考慮した処理を実装させることができる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment