You can wrap it in a try / catch block.
def join(age) do
query = from p in UsersInfo,
join: c in EditUserHistory,
where: c.users_info_id == p.id,
where: p.age > ^age,
select: %{full_name: p.full_name, email: c.old_email}
Repo.all(query)
rescue
e in Ecto.Query.CastError -> {:error, :cast_error}
else
results -> {:ok, results}
end