Elixir 模式匹配 ecto 错误

hen*_*ald 6 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
Run Code Online (Sandbox Code Playgroud)

Pat*_*wak 0

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

您可以针对该结构甚至针对映射使用简单的模式匹配。

case error do
   %Ecto.ConstraintError{} -> do_something()
   _ -> do_something_else()
end
Run Code Online (Sandbox Code Playgroud)

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

def handle_error_from_ecto(%Ecto.ConstraintError{} = error) do
  # do something here
end
Run Code Online (Sandbox Code Playgroud)