Exceptional v1.0.2 Exceptional.Value
Provide an escape hatch for propagating unraised exceptions
Summary
Macros
If an exception, return the exception, otherwise continue computation.
Essentially an Either
construct for Exception
s
Operator alias for exception_or_continue
Macros
Specs
exception_or_continue(term, Exception.t | any, (... -> any)) ::
Exception.t |
any
If an exception, return the exception, otherwise continue computation.
Essentially an Either
construct for Exception
s.
Note that this does not catch raise
or throw
s. If you want that behaviour,
please see Exceptional.Rescue
.
Examples
iex> 1 |> exception_or_continue(fn value -> value * 100 end.())
100
iex> %ArgumentError{message: "exception handled"}
...> |> exception_or_continue(fn value -> value * 100 end.())
%ArgumentError{message: "exception handled"}
iex> %ArgumentError{message: "exception handled"}
...> |> exception_or_continue(fn x -> x + 1 end.())
...> |> exception_or_continue(fn y -> y - 10 end.())
%ArgumentError{message: "exception handled"}
iex> %ArgumentError{message: "exception not caught"}
...> |> raise
...> |> exception_or_continue(fn value -> value * 100 end.())
** (ArgumentError) exception not caught
iex> Enum.fetch!([], 9) |> exception_or_continue(fn v -> v * 10 end.())
** (Enum.OutOfBoundsError) out of bounds error
Operator alias for exception_or_continue
Examples
iex> 1 ~> fn value -> value * 100 end.()
100
iex> exception = %Enum.OutOfBoundsError{message: "exception"}
...> exception ~> fn x -> x + 1 end.()
%Enum.OutOfBoundsError{message: "exception"}
...> exception
...> ~> fn x -> x + 1 end.()
...> ~> fn y -> y - 10 end.()
%Enum.OutOfBoundsError{message: "exception"}
...> raise(exception) ~> fn x -> x + 1 end.()
** (Enum.OutOfBoundsError) out of bounds error
iex> Enum.fetch!([], 9) ~> fn x -> x + 1 end.()
** (Enum.OutOfBoundsError) out of bounds error