以下代码是一个无效的变更集,它出错了,但是我花了很长时间才找到原因,因为错误消息最初没有匹配和记录。
我在管道末尾添加了一个案例语句,这是拾取管道错误的最佳方法吗?
User.changeset(%User{}, %{username: "username_is_test", password: "test", password_confirmation: "test", email: "test@test.com"})
|> Repo.insert
|> case do
{:ok, result} -> IO.puts("result")
{:error, error} -> IO.inspect error
end
管道和错误元组不能很好地协同工作。您可以像以前一样使用case
处理管道末尾的错误,但它仅在最后阶段有效。
对于返回错误元组的操作,我更喜欢使用 with
/else
语法:
with changeset <- User.changeset(%User{}, %{username: "username_is_test", password: "test", password_confirmation: "test", email: "test@test.com"})
{:ok, result} <- Repo.insert(changeset) do
IO.puts("result")
else
{:error, error} -> IO.inspect error
end
您可以根据需要在with
块中添加任意数量的可失败操作,并在else
块中使用模式匹配处理所有错误情况。
https://hexdocs.pm/elixir/Kernel.SpecialForms.html#with/1
你有几个选择。如果不想显式处理错误条件,则应改用Repo.insert!
。如果变更集无效,这至少会引发异常。
否则,应通过检查模板中的changeset.action
来使用案例句柄来处理{:error, changeset}
。
在更复杂的管道中,可能会中途出错,我已经开始使用with
特殊形式。
with result when not is_nil(result) <- fun1,
{:ok, result} <- fun2(result),
{:ok, result} <- fun3(result) do
success_handling(result)
else
nil -> # handle first failure
{:error, error} -> # handle other errors
_ -> # catch all failure
end