2016-12-04 16 views
0

下面的代碼使用Slick 3.1.x從表中讀取一行,試圖捕獲任何SQL錯誤。 UserDB是表的Slick表示,而User是相關對象。在Slick將來發生故障時捕獲SQL錯誤

此代碼不會在failure語句以下錯誤編譯:

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

如何解決這個問題,以趕上SQL錯誤?

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' reigsters回調並返回'Unit'。因此你的整個方法返回'Unit'。 – rethab

+0

謝謝。假設在失敗時我需要在日誌中寫入一個條目並返回'None'(而不是在正確讀取記錄時返回'Some'),那麼該怎麼辦呢? – ps0604

+0

不要使用'onFailure',而是使用'Future'上的方法來處理異常,並返回一些東西。 – rethab

回答

5

您可以使用asTry方法捕捉異常前成爲一個成功的結果失敗(前)和成功(V)的成功價值。在你的情況下,以下應該工作。

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) 
     }