2016-04-01 21 views
0

我正在使用構造函數Future.failed創建一個失敗的未來,但失敗的未來仍然會拋出異常,當我認爲它不應該。Scala Future.failed拋出傳遞給它的異常

方法session.loadAll確實會拋出異常。

我還使用了播放框架

Future.failed throws an exception image

有時甚至會出現使用try-catch塊 enter image description here

+0

我完全不知道你問了什麼。方法'loadAll'拋出一個異常,好的,你的模式匹配捕獲它,OK,然後你返回另一個'Future.failed'封裝一個新的'Exception',OK。有什麼問題?另外,截圖有什麼? – slouc

+0

@slouc我的意圖是返回一個Future,如你所說的那樣包裝一個異常,問題是不是返回未來,而是拋出異常。這就是我試圖用圖像展示的東西。應用程序不應該崩潰,因爲不會拋出任何異常(或者至少,這是我將來通過包裝異常而想要的) – vicaba

+1

哦,我明白了。但是'Future.failed(new Exception())'部分絕對不是拋出異常的部分。別的東西是。也許消耗getThings結果的部分並不期望未來失敗(儘管我不確定編譯器爲什麼會在第44行顯示異常)。我的屏幕截圖評論是說你應該總是發佈代碼片段,而不是圖片。 – slouc

回答

2

我認爲Future.failed不拋出異常。它看起來像是這樣,因爲堆棧跟蹤是在創建異常的地方生成的。

所以,如果你使用像Await.result的方法,或者假定未來是成功的另一種方法,你會看到異常重新拋出,但堆棧跟蹤將使它看起來就好像是在扔Future.failed

+0

'Await.result'通常是不鼓勵的,因爲它是一個阻塞呼叫。如果不需要阻止,'Future.onComplete'或'Future.onFailure'將遵循異步模式,並保持性能或更好。 http://docs.scala-lang.org/overviews/core/futures.html進一步解釋了爲什麼這是一個壞主意 – pgoggijr

+0

@pgoggijr是的,這是一個很好的觀點。 – Owen

1

首先,我不明白爲什麼您使用的是未來在這裏,因爲這些看起來不像異步調用。

但是,爲了回答你的問題,我不完全確定這裏發生了什麼,但看起來你需要處理異常。未來的消費者應使用Future.onComplete和模式匹配失敗類型,或Future.onFailure和Throwable類型上的模式匹配。

在未來的Scala文檔:http://docs.scala-lang.org/overviews/core/futures.html

+0

你說得對,問題出在消費者身上,它沒有處理異常 – vicaba