Skip to content

Commit 272e1a2

Browse files
committed
Implement suggestion by @michalmuskala
1 parent 2e58e79 commit 272e1a2

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

lib/elixir/lib/keyword.ex

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -436,24 +436,36 @@ defmodule Keyword do
436436
[:a, :b, :a]
437437
438438
iex> Keyword.keys([{:a, 1}, {"b", 2}, {:c, 3}])
439-
** (ArgumentError) expected a keyword list, but an element in the list is not a two-element tuple with an atom key; got: {"b", 2}
439+
** (ArgumentError) expected a keyword list, but an element in the list is not a two-element tuple with its first element being an atom; got: {"b", 2}
440440
441441
"""
442442
@spec keys(t) :: [key]
443443
def keys(keywords) when is_list(keywords) do
444-
:lists.map(
445-
fn
446-
{key, _} when is_atom(key) ->
447-
key
448-
449-
element ->
450-
raise ArgumentError,
451-
"expected a keyword list, but an element in the list is not a two-element tuple with an atom key; got: #{
444+
try do
445+
:lists.map(
446+
fn
447+
{key, _} when is_atom(key) ->
448+
key
449+
450+
element ->
451+
throw(element)
452+
end,
453+
keywords
454+
)
455+
catch
456+
element ->
457+
stacktrace =
458+
Enum.drop_while(__STACKTRACE__, fn
459+
{Keyword, :keys, 1, _} -> false
460+
{Keyword, _, _, _} -> true
461+
end)
462+
463+
reraise ArgumentError,
464+
"expected a keyword list, but an element in the list is not a two-element tuple with its first element being an atom; got: #{
452465
inspect(element)
453-
}"
454-
end,
455-
keywords
456-
)
466+
}",
467+
stacktrace
468+
end
457469
end
458470

459471
@doc """

0 commit comments

Comments
 (0)