Elixir模式匹配ecto错误

时间:2017-07-14 16:22:33

标签: elixir ecto

当插入失败数据库级别约束时,我依赖Ecto返回错误。

是否可以根据Ecto返回的错误类型运行不同的代码?

case Repo.insert(changeset) do
        {:ok, _} ->
            IO.puts("inserted")
        {:error, message} when is_certain_ecto_error ->
            IO.puts("database constraint error")
        {:error, message}  ->
            IO.puts("everything else error")
end

2 个答案:

答案 0 :(得分:3)

就像Justin说的那样,你会得到{:error, changeset},变更集会有errors关键字列表,你可以在其中进行模式匹配。

case Repo.insert(changeset) do
    {:ok, _} -> 
        IO.puts("inserted")
    {:error, %{ errors: errors }} ->                  
        Enum.map(errors, &handle_error(&1))
end

defp handle_error({:user_name, {message, _}}) do
   "User name error:" <> message
end
defp handle_error({_some_key, _error_tuple}), do: "some error"

答案 1 :(得分:0)

您可以随时重写代码以使用try / rescue块或简单模式匹配Ecto.ConstraintError,因为它只不过是一个结构。

您可以对该结构使用简单的模式匹配,甚至可以使用地图。

case error do
   %Ecto.ConstraintError{} -> do_something()
   _ -> do_something_else()
end

我认为最好的解决方案是创建一个处理所有错误的函数,并在函数签名中使用模式匹配,例如。

def handle_error_from_ecto(%Ecto.ConstraintError{} = error) do
  # do something here
end