LoginSignup
1
0

More than 1 year has passed since last update.

Scalaの勉強はじめました 9 〜関数型プログラミング編 エラー処理の続き〜

Posted at

はじめに

N予備校で「Scala応用」コースを受講しています。

Either

Option型の場合、エラーの種類までは取得できない。
2つの値のどちらかを表現するデータ型。
Leftにはエラー、Rightには正常の値を入れる。

sealed trait LoginError
case object InvalidPassword extends LoginError
case object UserNotFound extends LoginError
case object PasswordLocked extends LoginError

case class User(id: Long, name: String, password: String)

object LoginService {
  def login(name: String, password: String): Either[LoginError, User] = {
    (name, password) match {
      case ("taro", "Password1") => Right(User(1, name, password))
      case ("taro", _) => Left(InvalidPassword)
      case (_, _) => Left(UserNotFound)
    }
  }
}

呼び出し

LoginService.login(name = "taro", password = "Password1") match {
  case Right(user) => println(s"id: ${user.id}")
  case Left(InvalidPassword) => println(s"Invalid Password!")
  case Left(UserNotFound) => println(s"User Not Found!")
  case Left(PasswordLocked) => println(s"Password Locked!")
}

Try

SuccessFailureの2つのデータ型を持つ。

import java.lang.Runtime
import scala.util.{Failure, Success, Try}

object TryTest {

  def isCat(animal: String): Boolean = {
    Try {
      if (animal == "Cat")
        true
      else {
        throw new Exception
        false
      }
    } match {
      case Success(_) =>
        println("ねこだよ")
        true
      case Failure(_) =>
        println("ねこじゃないよ")
        false
    }
  }
}

Tryで引っかかる例外はNoFatalなものだけ。
引数にString以外のものを入れてもFailureに入るわけじゃない。

まとめ

使い分けとして、

Nullを使う場合 => Option
Optionでは情報が不足している、エラー状態が定義されている => Either
例外を値として扱いたい場合 => Try

が目安になるみたい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0