我希望以下代碼在方法callfuture1()
或callfuture2()
之一引發異常時返回自定義消息。我的理解是,如果任一未來失敗,f
將是一個失敗的未來。無法處理將來出現故障的異常
但是,當callfuture1
引發異常。 f.onFailure
未執行。相反,我看到在callFuture1()
的代碼行停止了調用堆棧,發生異常並返回了標準的internalError。爲什麼會發生?
val f = for {
x <- callfuture1()
y <- callfuture2()
} yield y
f.onFailure {
//send an internalserver error with some custom message
}
f.map {
//send data back
}
==== ====更新
我從反應看,潛在的問題是,異常被未來外拋出,因此我的代碼無法趕上未來的失敗。 所以我改變了代碼,使得Exception只在未來發生。我仍然無法解釋我所看到的行爲。 (我想知道它是否與Play框架有關。)
def controllerfunction(id: String) = Action.async{
val f = for{
x <- callfuture1(id)
y <- callfuture2(x)
} yield y
y.onFailure{case t =>
println("This gets printed");
Ok("shit happened, but i am still ok")}
y.map{resp:String => Ok(resp)}
}
def callfuture1(id: String):Future[Obj1] = {
for {
val1 <- callfuture1.1(id)
val2 <- callfuture1.2(val1)
} yield val2
}
def callfuture1.2:Future[Obj3] = Future{
thrown new Exception("TEST ME");
}
def callfuture 1.1:Future[Obj4] = {...}
def callfuture2: Future[String] = {....}
期望值。 方法callfuture1.2拋出未來幾年內的異常,所以onFailure處應執行我的意料,(它得到執行),並返回的響應應該「媽的事,但我還行」
Actuality 該播放框架返回InternalServerError,我看到我的控制檯上的錯誤堆棧。我看到printlin(「這被打印」)正在執行。
不知道發生了什麼事。任何見解?
====更新2 =====
我覈實,內心戲框架的控制器調用的時候,問題只發生(我用打2.5)。作爲一個獨立的scala程序,everthing按預期工作。我相信遊戲錯誤處理會捕獲未經處理的異常並打印堆棧跟蹤。我認爲這應該只發生在開發環境中。
嘗試'val f1 = callfuture1(); val f2 = callfuture2; f = {x < - f1; y < - f2}產生y'。不同的是,在你的情況下,期貨正在順序執行(y等待callfuture1完成)。 – chuwy
「堆棧停止」是什麼意思?什麼是「標準內部錯誤」?你怎麼知道'onFailure'沒有執行?什麼是實際的錯誤? – Dima
另外。請注意'onFailure'只能用於副作用。它不能改變'Future'中包含的異常。如果你想擺弄異常,你需要使用'轉換'或'恢復' – Dima