Skip to content

Commit 2716bb6

Browse files
committed
Provide more information on out of bound errors to aid debugging
1 parent 6a96204 commit 2716bb6

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

lib/elixir/lib/access.ex

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,7 @@ defmodule Access do
807807
iex> get_in([:a, :b, :c], [Access.at!(2)])
808808
:c
809809
iex> get_in([:a, :b, :c], [Access.at!(3)])
810-
** (Enum.OutOfBoundsError) out of bounds error
810+
** (Enum.OutOfBoundsError) out of bounds error at position 3 when traversing enumerable [:a, :b, :c]
811811
812812
"""
813813
@doc since: "1.11.0"
@@ -819,12 +819,14 @@ defmodule Access do
819819
defp at!(:get, data, index, next) when is_list(data) do
820820
case Enum.fetch(data, index) do
821821
{:ok, value} -> next.(value)
822-
:error -> raise Enum.OutOfBoundsError
822+
:error -> raise Enum.OutOfBoundsError, index: index, enumerable: data
823823
end
824824
end
825825

826826
defp at!(:get_and_update, data, index, next) when is_list(data) do
827-
get_and_update_at(data, index, next, [], fn -> raise Enum.OutOfBoundsError end)
827+
get_and_update_at(data, index, next, [], fn ->
828+
raise Enum.OutOfBoundsError, index: index, enumerable: data
829+
end)
828830
end
829831

830832
defp at!(_op, data, _index, _next) do

lib/elixir/lib/enum.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,14 +1074,14 @@ defmodule Enum do
10741074
6
10751075
10761076
iex> Enum.fetch!([2, 4, 6], 4)
1077-
** (Enum.OutOfBoundsError) out of bounds error
1077+
** (Enum.OutOfBoundsError) out of bounds error at position 4 when traversing enumerable [2, 4, 6]
10781078
10791079
"""
10801080
@spec fetch!(t, index) :: element
10811081
def fetch!(enumerable, index) when is_integer(index) do
10821082
case slice_forward(enumerable, index, 1, 1) do
10831083
[value] -> value
1084-
[] -> raise Enum.OutOfBoundsError
1084+
[] -> raise Enum.OutOfBoundsError, index: index, enumerable: enumerable
10851085
end
10861086
end
10871087

lib/elixir/lib/exception.ex

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,7 +2216,25 @@ defmodule Enum.OutOfBoundsError do
22162216
For example, this is raised by `Access.at!/1`.
22172217
"""
22182218

2219-
defexception message: "out of bounds error"
2219+
defexception [:enumerable, :index, :message]
2220+
2221+
@impl true
2222+
def message(exception = %{message: nil}), do: message(exception.index, exception.enumerable)
2223+
def message(%{message: message}), do: message
2224+
2225+
def message(index, enumerable) do
2226+
"out of bounds error" <>
2227+
if index do
2228+
" at position #{index}"
2229+
else
2230+
""
2231+
end <>
2232+
if enumerable do
2233+
" when traversing enumerable #{inspect(enumerable)}"
2234+
else
2235+
""
2236+
end
2237+
end
22202238
end
22212239

22222240
defmodule Enum.EmptyError do

0 commit comments

Comments
 (0)