Error handling Elixir错误处理管道选项

Error handling Elixir错误处理管道选项,error-handling,elixir,Error Handling,Elixir,下面的代码是一个无效的变更集,其中包含错误,但是我花了很长时间才找到原因,因为错误消息最初没有被匹配和记录 我在管道末端添加了一个案例陈述,这是拾取管道中错误的最佳方法吗 User.changeset(%User{}, %{username: "username_is_test", password: "test", password_confirmation: "test", email: "test@test.com"}) |> Repo.insert |>

下面的代码是一个无效的变更集,其中包含错误,但是我花了很长时间才找到原因,因为错误消息最初没有被匹配和记录

我在管道末端添加了一个案例陈述,这是拾取管道中错误的最佳方法吗

    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

管道和错误元组不能很好地协同工作。您可以在管道末尾使用案例处理错误,但它只在最后阶段起作用

对于返回错误元组的操作,我更喜欢使用with/else语法:

您可以根据需要在with块中添加任意多个可失败的操作,并在else块中使用模式匹配处理所有错误情况


管道和错误元组不能很好地协同工作。您可以在管道末尾使用案例处理错误,但它只在最后阶段起作用

对于返回错误元组的操作,我更喜欢使用with/else语法:

您可以根据需要在with块中添加任意多个可失败的操作,并在else块中使用模式匹配处理所有错误情况


你有几个选择。如果不想显式处理错误条件,则应使用Repo.insert!相反如果变更集无效,至少会引发异常

否则,您应该通过检查模板中的changeset.action来使用大小写句柄处理{:error,changeset}

在可能出现部分错误的更复杂的管道中,我已经开始使用带有特殊形式的

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

你有几个选择。如果不想显式处理错误条件,则应使用Repo.insert!相反如果变更集无效,至少会引发异常

否则,您应该通过检查模板中的changeset.action来使用大小写句柄处理{:error,changeset}

在可能出现部分错误的更复杂的管道中,我已经开始使用带有特殊形式的

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

不是最漂亮的,但已经足够好了,还要注意的是,一个无效的变更集将被分配给错误变量,因此它不是一个真正好的命名。不是最漂亮的变更集,但它已经足够好了,还要注意,一个无效的变更集将被分配给错误变量,因此它不是一个真正好的命名。