如何在 Ecto / Elixir 中优雅地显示错误?

How to gracefully show error in Ecto / Elixir?

类似于Repo.get!(User, 10)

结果如下:

(Ecto.NoResultsError) expected at least one result but got none in query:

from u in Db.User,
  where: u.id == ^10

    (ecto) lib/ecto/repo/queryable.ex:80: Ecto.Repo.Queryable.one!/4

我怎样才能优雅地 return 像 {:error, "No Record found"}

我可以使用 try do 块,但它在 Elixir 中不受欢迎。或者我可以使用递归函数方法

我是这样想的(虽然行不通,只是一个概念):

def find_user(id) do
  case res = Repo.get!(User, id) do
     Ecto.NoResultsError -> {:error, "not found"}
     _ -> {:ok, res}
   end
end

这不是 Phoenix 应用程序。

使用 Repo.get/2 并检查 nil

case Repo.get(User, id) do
  nil -> {:error, :not_found}
  user -> {:ok, user}
end

虽然@JayJun 的答案是完全有效的,[可以说]更惯用的方法是实现一个 helper,它有两个不同的子句:

defp gracefully_handle_get(nil), do: {:error, :not_found}
defp gracefully_handle_get(user), do: {:ok, user}

并这样使用它:

User
|> Repo.get(id)
|> gracefully_handle_get()