【问题标题】:Dispatch error handling调度错误处理
【发布时间】:2012-09-22 17:34:59
【问题描述】:

我以这种(简单、阻塞)的方式从我的请求中得到响应:

val response = Http(req)()

但是我从 Play 收到了这个错误!框架:

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

我从来没有考虑过 Dispatch 或 Scala 中的异常处理。在 Dispatch 库中我必须注意哪些错误?捕获每种类型/类别的错误的语句是什么?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    在这种情况下处理异常的一种常见方法是使用Either[Throwable, Whatever] 来表示结果,其中某种失败实际上并不是那么异常。 Dispatch 0.9 通过Promise 上的either 方法(顺便说一下,我在my answer to your earlier question 中使用)使这变得很方便:

    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 来更方便地处理故障,例如this Stack Overflow answer

    【讨论】:

    • 有没有办法在返回 200 以外的 HTTP 代码时获取响应正文?
    • 嗨,那里的模式匹配是等待还是阻塞,直到你得到响应,就像你使用 for comprehension 一样?我对使用此解决方案是否安全感到有些困惑。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2018-09-19
    • 2018-01-29
    • 2020-07-11
    • 2021-03-03
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多