2016-12-04 9 views
0

以下のコードは、Slick 3.1.xを使用してテーブルから行を読み込み、SQLエラーをキャッチしようとしています。 UserDBはテーブルのSlick表現であり、Userが関連オブジェクトです。Slickの今後のエラーでSQLエラーをキャッチ

このコードは、次のエラーでfailure文ではコンパイルされません:SQLエラーをキャッチするために、この問題を解決する方法

type mismatch; found : Unit required: scala.concurrent.Future[Option[user.manage.User]]

def read (sk: Int): Future[Option[User]] = { 
     val users = TableQuery[UserDB] 
     val action = users.filter(_.sk === sk).result 
     val future = db.run(action) 
     future.onSuccess { 
     case result => 
       if (!result.isEmpty) 
        Some(result(0)) 
       else 
        None 
     } 
     future.onFailure { // <-- compilation error 
      case e => println (e.getMessage) 
      None 
     } 
    } 
+0

'onFailure'はコールバックを呼び出して' Unit'を返します。したがって、メソッド全体が 'Unit'を返します。 – rethab

+0

ありがとうございます。失敗した場合、ログにエントリを書き込み、 'None'を返す必要があると仮定します(レコードが正しく読み込まれている場合は' Some'を返すのとは対照的に)。 – ps0604

+0

'onFailure'を使わず、例外を処理して何かを返す' Future'のメソッドを使用しないでください。 – rethab

答えて

5

あなたは成功した結果の失敗(EX)と成功に成功した値(V)に、例外の元をキャッチするためにasTryメソッドを使用することができます。あなたのケースでは、次のように動作するはずです。

db.run(action.asTry).map{ 
    case Failure(ex) => { 
     Log.error(s"error : ${ex.getMessage}") 
     None 
     } 
    case Success(x) => x 
} 

slick documentationで述べたように、asTryは回復処理ロジックの例外パイプラインに使用されています。

0

将来のonCompleteメソッドを使用できます。

 future.onComplete{ 
      case Success(r) ⇒ ... 
      case Failure(t) ⇒ log.error("failure in db query " + t.getMessage) 
     } 
関連する問題