2016-04-01 3 views
0

私はFuture.failedコンストラクタを使用して失敗した未来を作成していますが、失敗した未来は、Scala Future.failedは、渡された例外をスローします

session.loadAllメソッドは例外をスローします。

また、私はそれも enter image description here

+0

私はあなたが何を聞いたか全く分かりません。メソッド 'loadAll'は例外をスローします.OK、パターンマッチングがそれをキャッチします。そして、新しい' Exception'をラップする別の 'Future.failed'を返します。どうしたの?また、スクリーンショットには何がありますか? – slouc

+0

@slouc私の意図は、あなたが言ったようにFutureを返す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

まずtry-catchブロックを使用して起こる

Future.failed throws an exception image

が、私はあなたが使用している理由は、非常にわからないプレイFrameworkを使用していますこれは非同期呼び出しのようには見えないからです。

しかし、あなたの質問に答えるために、私はここで何が起こっているのか完全にはわかりませんが、例外を処理する必要があるようです。未来の消費者は、Future.onCompleteのいずれかを使用し、パターンは失敗タイプ、つまりFuture.onFailureとThrowableタイプのパターンマッチのいずれかを使用する必要があります。将来に関する

Scalaのドキュメント:http://docs.scala-lang.org/overviews/core/futures.html

+0

問題は消費者にありますが、例外を処理していませんでした。 – vicaba