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中,并返回带有成功报告的元组.在这种情况下,我不确定如何构建我的代码以最好地向用户报告错误.
这正是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}.