作者:浪迹天涯沃热尔_441 | 来源:互联网 | 2023-02-08 12:07
假设您具有以下功能:
def get_city_temp(city_id) do
'blahblahcityforcastfortoday.com/request/#{city_id}'
|> HTTPoison.get
|> parse_body
|> get_forecast
|> get_temp
end
现在说GET
失败了,所以响应是:
{:ok, %HTTPoison.Response{status_code: 400, ...}}
但是get_forecast
期待一个形成良好的身体,因此会抱怨传递给它的结构,或丢失的钥匙等.处理这样的错误的最佳方法是什么?在其他语言中,我只是将所有函数调用包装在try
catch
s中,并返回带有成功报告的元组.在这种情况下,我不确定如何构建我的代码以最好地向用户报告错误.
1> Dogbert..:
这正是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}
如果任何模式匹配失败,则整个事件返回该值.例如,如果在get_forecast
返回{:error, :foo}
所有先前函数后返回{:ok, _}
,with
则将返回{:error, :foo}
.
唯一的问题是,`=`应该替换为`<-`,否则匹配时由于问题会"上升".除此之外,这是要走的路!