3

私は私の要求からこの(単純な、ブロックする)方法で応答を受け取ります:

val response = Http(req)()

しかし、私はPlayからこのエラーを受け取りました!フレームワーク:

ExecutionException: java.net.ConnectException: Connection refused to http://localhost:8983/update/json?commit=true&wt=json

そのことについて、DispatchやScalaでの例外処理について考えたことはありません。ディスパッチライブラリで注意しなければならないエラーは何ですか?エラーの各タイプ/クラスをキャッチするためのステートメントは何ですか?

4

1 に答える 1

6

ある種の失敗が実際にはそれほど例外的ではないこの種の状況で例外を処理する一般的な方法の1つはEither[Throwable, Whatever]、結果を表すために使用することです。eitherDispatch 0.9は、次の方法でこれを便利にします(ちなみに、以前の質問への回答Promiseで使用します)。

import com.ning.http.client.Response

val response: Either[Throwable, Response] = Http(req).either()

これで、パターンマッチングを非常に自然に使用して、例外を処理できます。

import java.net.ConnectException

response match {
  case Right(res)                => println(res.getResponseBody)
  case Left(_: ConnectException) => println("Can't connect!")
  case Left(StatusCode(404))     => println("Not found!")
  case Left(StatusCode(code))    => println("Some other code: " + code.toString)
  case Left(e)                   => println("Something else: " + e.getMessage)
}

失敗の処理をより便利にするために使用できる他の多くの方法もあります。Eitherたとえば、このStackOverflowの回答を参照してください。

于 2012-09-22T18:25:55.000 に答える