2016-10-26 12 views
1

私はFPパラダイムに応じて、以下の機能を変換しようとしています:、検索機能の例

def findByEmail(email: String): User = { 
    val result = jdbc.find("select * from user where email..") 
    return result; 
} 

私の最初の試みは、次のいずれかです。

def findByEmail(email: String): Either[String, Option[User]] = { 
    try { 
     val result = jdbc.find("select * from user where email..") 
    } catch (Exception e) { 
     return Left(e.getMessage()) 
    } 

    if (result == null) return Right(None) 

    Right(result) 
} 

Iの事好きではないすべての例外をキャッチしようとする試みです。そんなことに良い練習はありますか?いずれかの左側にStringよりも優れたデータ型がありますか?そこにExceptionクラスを使用してもよろしいですか?

+1

これは実際にはFPとは関係ありません。あなたは 'Exception'をすべて捕まえることはほとんどありません。 – Carcigenicate

+1

あなたの質問は不明です。あなたの最初の例では、2番目の例では例外をすべてキャッチしません。あなたは本当に例外を流す方法を尋ねていますか? –

+0

例外をすべて捕まえるべきではありませんが、例外的に例外はRTを破るため、型の安全ではありません。どうすれば私のAPIの呼び出し側に強制的に処理させることができますか? – user3763116

答えて

5

代わりに、Try[User]を送信する方法もあります。その後、呼び出し側はSuccess[A]Failure[Throwable]に一致させることができます。

def findByEmail(email: String): Try[User] = Try { jdbc.find("select * from user where email..") } 

そして、あなたはTryからデータを抽出したり、それにメソッドを構成するか、発信者を強制:あなたがしたい場合は

findByEmail("[email protected]") match { 
    case Success(user) => // do stuff 
    case Failure(exception) => // handle exception 
} 

しますか、構成する方法:

// If the Try[User] is a Failure it will return it, otherwise executes the function. 
findByEmail("[email protected]").map { case user => // do stuff } 

@Reactormonkとして別のオプションは、コメントに書いた楽しみであるdoobieを使用することですScala用のJDBCよりも抽象化された抽象レイヤーです。