当插入失败数据库级别约束时,我依赖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
答案 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