Elixir 中错误处理的最佳方式是什么

sma*_*hno 2 elixir phoenix-framework

我正在使用简单的凤凰灵药应用程序。在此应用程序中,我尝试公开一个 REST API 来保存和检索数据。

就我而言,如果主键(电子邮件地址)重复,我的应用程序将引发错误。我需要知道处理这个错误的最佳方法;try-catch 或任何其他更好的解决方案。

这是我的数据保存方法

def post(conn, %{"stooge" => stooge, "name" => name, "email" => email , "password" => password})do
    respond = Repo.insert!(%ApiDb.User{name: name, email: email, stooge: stooge, password: password})
    json conn, respond
  end
Run Code Online (Sandbox Code Playgroud)

样本有效载荷

{
    "stooge": "moe",
    "name": "Joe",
    "email": "p31111ww11eee32111111134@dmain.com",
    "password":"asdasd"
}
Run Code Online (Sandbox Code Playgroud)

模型/user.ex

defmodule ApiDb.User do
  use ApiDb.Web, :model
  schema "users" do
    field :password, :string
    field :name, :string
    field :email, :string
    field :stooge, :string
    timestamps()
  end

   @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:name, :email, :password, :stooge])
    |> validate_required([:name, :email, :password])
    |> validate_format(:email, ~r/@/)
  end
end
Run Code Online (Sandbox Code Playgroud)

错误 在此输入图像描述

我尝试了 try-catch 块,但没有成功

try do
    respond = Repo.insert!(%ApiDb.User{name: name, email: email, stooge: stooge, password: password})
    json conn, respond
rescue 
  e in Ecto.ConstraintError -> IO.puts("An error occurred: ")
end
Run Code Online (Sandbox Code Playgroud)

Ste*_*len 5

调用 ApiDbUser.changeset 函数,然后使用变更集调用 Repo.insert。它将返回带有 :ok 或 :error 的元组

def post(conn, params) do
  changeset = ApiDb.User.changeset(%ApiDb.User{}, params)
  case Repo.insert(changeset) do
    {:ok, user} -> 
       # create a render("user.json", params) function in your UserView
       render conn, "user.json", user: user
    {:error, changeset} 
      # create a render("error.json", params) function in your UserView
      render conn, "error.json", changeset: changeset
  end
end
Run Code Online (Sandbox Code Playgroud)