メソッドの1つがcallfuture1()
またはcallfuture2()
の場合に例外をスローすると、次のコードでカスタムメッセージを返すようにします。将来のどちらかが失敗した場合、私の理解は、f
が失敗した未来になるでしょう。将来のエラーから例外を処理できません
ただし、callfuture1
が例外をスローした場合。 f.onFailure
は実行されません。代わりに、例外の発生した標準のinternalErrorが返されるcallFuture1()
のコード行でコールスタックが停止しているのがわかります。なぜそれが起こるのですか?
val f = for {
x <- callfuture1()
y <- callfuture2()
} yield y
f.onFailure {
//send an internalserver error with some custom message
}
f.map {
//send data back
}
==== ====更新
私は潜在的な問題は、その例外が今後の外に投げされているので、私のコードは、それが将来的に失敗したキャッチに失敗していることを、応答から見ます。 したがって、例外が将来発生するようなコードを変更しました。私はまだ私が見ている行動を説明することができません。 (それはプレイフレームワークとは何かを持っているのだろうか。)
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] = {....}
期待。私の予想は(実行取得ん)、ONFAILURE実行されるべきであり、応答がなければならない返されたので 方法callfuture1.2は、将来の内部例外をスロー「くそが起こったが、私はまだ大丈夫だ」
実際 再生フレームワークでInternalServerErrorが返され、コンソールにエラースタックが表示されます。私はprintlin( "This gets gets printed")が実行されているのを見ます。
カントは何が起こっているのか理解しています。どんな洞察?
====更新2 =====
私は、プレイフレームワークのコントローラ内部で呼び出されたときに問題がのみ発生することを確認し(私はプレー2.5を使用しています)。スタンドアロンのスカラプログラムとして、これまでどおりに動作します。私は、再生エラー処理が未処理の例外をキャッチし、スタックトレースを出力すると信じています。私はこれが開発環境でのみ起こるべきだと思います。
「val f1 = callfuture1(); val f2 = callfuture2; f = {x < - f1; y < - f2}はy 'を出力する。違いは、あなたの場合、先物が順番に実行されていることです(yはcallfuture1が完了するのを待っています)。 – chuwy
「スタックが停止しました」とはどういう意味ですか? 「標準的な内部エラー」とは何ですか?あなたは 'onFailure'が実行されていないことをどのように知っていますか?実際のエラーとは何ですか? – Dima
また。 'onFailure'は副作用にしか使えないことに注意してください。 'Future'に含まれる例外を変更することはできません。例外を抱く場合は、 'transform'または' recover'を使用する必要があります。 – Dima