Elixir 外星误差的长生不老药模式匹配

Elixir 外星误差的长生不老药模式匹配,elixir,ecto,Elixir,Ecto,当一个insert未能满足数据库级别的约束时,我依靠EXTO返回一个错误 是否可以根据Ecto返回的错误类型运行不同的代码 case Repo.insert(changeset) do {:ok, _} -> IO.puts("inserted") {:error, message} when is_certain_ecto_error -> IO.puts("database constraint er

当一个insert未能满足数据库级别的约束时,我依靠EXTO返回一个错误

是否可以根据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

您可以随时重写代码,以使用
try/rescue
block或简单的模式匹配来对抗exto.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

正如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"
case Repo.insert(变更集)do
{:好的,{}->
IO.puts(“插入”)
{:错误,%{errors:errors}}->
枚举映射(错误和句柄错误(&1))
结束
defp句柄错误({:用户名,{message,{})do
“用户名错误:”消息
结束
defp handle_error({u some_key,{u error_tuple}),do:“some error”

exto将在插入失败时返回一个
{:error,changeset}
元组。您需要查看错误并决定要做什么。那么完整的字符串检查?有没有一个很好的方法来检查一个异位的