管道和错误处理

cat*_*ory 1 error-handling exception-handling pipe elixir

假设您具有以下功能:

def get_city_temp(city_id) do
   'blahblahcityforcastfortoday.com/request/#{city_id}'
   |> HTTPoison.get
   |> parse_body
   |> get_forecast
   |> get_temp
end
Run Code Online (Sandbox Code Playgroud)

现在说GET失败了,所以响应是:

{:ok, %HTTPoison.Response{status_code: 400, ...}}
Run Code Online (Sandbox Code Playgroud)

但是get_forecast期待一个形成良好的身体,因此会抱怨传递给它的结构,或丢失的钥匙等.处理这样的错误的最佳方法是什么?在其他语言中,我只是将所有函数调用包装在try catchs中,并返回带有成功报告的元组.在这种情况下,我不确定如何构建我的代码以最好地向用户报告错误.

Dog*_*ert 5

这正是with/1宏的意思.假设parse_body和其他功能也会{:ok, _}在成功和{:error, _}失败时返回,您可以:

with {:ok, response} <- HTTPoison.get(...),
     {:ok, parsed} <- parse_body(response),
     {:ok, forecast} <- get_forecast(parsed),
     {:ok, temp} <- get_temp(forecast), do: {:ok, temp}
Run Code Online (Sandbox Code Playgroud)

如果任何模式匹配失败,则整个事件返回该值.例如,如果在get_forecast返回{:error, :foo}所有先前函数后返回{:ok, _},with则将返回{:error, :foo}.

  • 唯一的问题是,`=`应该替换为`<-`,否则匹配时由于问题会"上升".除此之外,这是要走的路! (4认同)