2017-07-14 57 views
1

我依靠Ecto在插入失败的数据库级别约束时返回一个错误。ecto错误中的Elixir模式匹配

根据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 
+1

当插入失败时,Ecto将返回一个'{:error,changeset}'元组。您需要查看错误并决定要做什么。 –

+0

那么一个完整的字符串检查?有没有一种很好的方式来检查Ecto.ConstraintError –

回答

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 
2

像贾斯汀说,你会得到{: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"