模式匹配HTTpoison反应药剂

Jun*_*ooq 2 elixir httpoison

有什么方法可以模式匹配的错误响应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
Run Code Online (Sandbox Code Playgroud)

但是它没有抓住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
Run Code Online (Sandbox Code Playgroud)

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

Dog*_*ert 5

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
Run Code Online (Sandbox Code Playgroud)

但是,这不是很好的代码,因为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
Run Code Online (Sandbox Code Playgroud)