【问题标题】:pattern match HTTpoison response Elixir模式匹配 HTTpoison 响应 Elixir
【发布时间】:2017-03-06 03:48:43
【问题描述】:

有什么方法可以模式匹配httpoison 的错误响应?我正在这样做

case HTTPoison.get!(url, [], []) do
  %HTTPoison.Error{reason: reason} ->
    IO.inspect "Media: #{reason}!"
    :timer.sleep(:timer.seconds(3))
    do_loop(starting, ending, interval, camera_exid)
  response ->
    upload(response.status_code, response.body, starting, camera_exid)
    do_loop(starting + interval, ending, interval, camera_exid)
end

但它没有捕捉到timeout 并给了我错误

** (HTTPoison.Error) :timeout
    (httpoison) lib/httpoison.ex:66: HTTPoison.request!/5
    (extractor) lib/snapshot/snap_extractor.ex:67: Extractor.SnapExtractor.do_loop/4
       (elixir) lib/enum.ex:651: Enum."-each/2-lists^foreach/1-0-"/2
       (elixir) lib/enum.ex:651: Enum.each/2

我认为这样做是错误的。有什么建议吗?

【问题讨论】:

    标签: elixir httpoison


    【解决方案1】:

    HTTPoison.get!会将raise异常,不会返回一个,所以需要使用try ... rescue ...:

    try do
      response = HTTPoison.get!(url, [], [])
      upload(response.status_code, response.body, starting, camera_exid)
      do_loop(starting + interval, ending, interval, camera_exid)
    rescue
      %HTTPoison.Error{reason: reason} ->
        IO.inspect "Media: #{reason}!"
        :timer.sleep(:timer.seconds(3))
        do_loop(starting, ending, interval, camera_exid)
    end
    

    然而,这不是好的代码,因为 HTTPoison 也有 get,它返回 {:ok, response} 或 {:error, error},您可以按如下方式使用:

    case HTTPoison.get(url, [], []) do
      {:ok, response} ->
        upload(response.status_code, response.body, starting, camera_exid)
        do_loop(starting + interval, ending, interval, camera_exid)
      {:error, %HTTPoison.Error{reason: reason}} ->
        IO.inspect "Media: #{reason}!"
        :timer.sleep(:timer.seconds(3))
        do_loop(starting, ending, interval, camera_exid)
    end
    

    【讨论】:

    • 我不认为第一部分是有效的语法,至少在 Elixir 1.7+ 中是这样。对于类似的东西,我收到 invalid "rescue" clause. The clause should match on an alias, a variable or be in the "var in [alias]" format 编译错误,而 e in SomeError -> 很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2017-10-17
    • 2017-03-16
    • 1970-01-01
    • 2013-06-25
    • 2015-08-10
    相关资源
    最近更新 更多