如何在 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()
类似于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()