2017-02-19 9 views
1

私は、単純なアクション機能があります。内部関数を介してアクション関数に例外を返す方法はありますか?

def someActionFunc() = Action.async { request => 

myService.doSomething1().map { res => 
     logger.debug(res.getMessageId) 
     Ok(res.getMessageId) 
     }.recover { 
     case ex => 
      logger.error(s"fail:", ex) 
      BadRequest(s"fail with error: ${ex.getMessage}") 
     } 
} 

doSomething1Futureを返し、doSomething1に私はいくつかのオブジェクトを返し、例外が起こった他のいくつかの機能doSomething2を呼んでいるが、私はどのように知りません

:私は、だから私のような何かをする doSomething2にしようとした fail with error: my reason

ユーザーに返したい原因アクション機能(someActionFunc)にdoSomething1を通じてdoSomething2で起こったエラーを返します

def doSomething2(someCondition: Boolean) = { 
     if (someCondition){ 
     throw new RuntimeException("my reason") 
     } 
    } 

が、私はアクション機能を投げるどのように私は、ユーザーに適切にエラーを返すことができ、投げ出されますか?

答えて

2

Scalaでは、Future[T]は実際には完了するまでに少し時間がかかりますTry[T]です。次に、Try[T]のみSuccess[T]またはFailure[T]となります。Failure[T]は実際には例外のラッパーです。

あなたのエラー処理チェーンが動作していない理由は、あなたが(機能から完全に返り値にをもと)取り扱いのScalaの機能的なスタイルを回避し、代わりにJavaスタイルにthrowイディオムを使用していることである - もちろんどのJVMではまだ動作しますが、Scalaではなくイディオムで動作します。

あなたはこのようなdoSomething2書き換える場合:

def doSomething2(someCondition: Boolean):Future[Int] = { 
    if (someCondition){ 
    Future.failed(new RuntimeException("my reason")) 
    } else { 
    Future.succesful(42) 
    } 
} 

をあなたは慣用的なScalaのエラー処理、あなたが探している取得します。

には、いくつかの注意事項:

  • 私はExceptionインスタンスを作成が便利な私の可能性のある結果
  • の周りに必要なラッパーを構築するためにFutureオブジェクトfailed()successful()メソッドを使用し、 I neverthrow it
  • 私はexpコンパイラが正しいことを保証するために返す型をdoSomething2と明示的に指定しました。戻り値の型は以前はdoSomething2でしたか? Unit
関連する問題