This repository was archived by the owner on Jun 10, 2024. It is now read-only.
This repository was archived by the owner on Jun 10, 2024. It is now read-only.
badarity must always include the stacktrace in the error reason #548
Open
Description
When Lumen raises badarity
and it is passed through a monitor, it has Info
as {badarity, {Fun, Args}}
, but it is supposed to be {{badarity, {Fun, Args}}, Stacktrace}
. I believe this is the case because when badarity happens it counts as exit reason, which is always {reason, stacktrace}
.
Lumen
init.erl
-module(init).
-export([start/0]).
-import(erlang, [display/1]).
-import(lumen, [log_exit/1]).
start() ->
log_exit(false),
{ParentPid, ParentMonitorReference} = spawn_monitor(fun () ->
Options = [link, monitor],
spawn_opt(fun (_) ->
ok
end, Options),
wait_to_shutdown()
end),
receive
{'DOWN', ParentMonitorReference, process, _, Info} ->
case Info of
{Reason = badarity, _FunArgs} ->
display({parent, Reason});
_ ->
display({parent, Info})
end
after
10 ->
display({parent, alive, is_process_alive(ParentPid)})
end.
wait_to_shutdown() ->
receive
shutdown -> ok
end.
BEAM
start.erl
-module(start).
-export([start/0]).
-import(erlang, [display/1]).
start() ->
{ParentPid, ParentMonitorReference} = spawn_monitor(fun () ->
Options = [link, monitor],
spawn_opt(fun (_) ->
ok
end, Options),
wait_to_shutdown()
end),
receive
{'DOWN', ParentMonitorReference, process, _, Info} ->
case Info of
{{Reason = badarity, _FunArgs}, _Stacktrace} ->
display({parent, Reason});
_ ->
display({parent, Info})
end
after
10 ->
display({parent, alive, is_process_alive(ParentPid)})
end,
ok.
wait_to_shutdown() ->
receive
shutdown -> ok
end.
Commands
erl
c(start).
start:start().
Output
{parent,badarity}
ok
=ERROR REPORT==== 24-Aug-2020::11:52:33.289409 ===
Error in process <0.146.0> with exit value:
{{badarity,{#Fun<start.1.105435764>,[]}},[{erlang,apply,2,[]}]}
Difference with exit/1
It should be noted that exit(reason)
DOES NOT include the stack trace and so counts whatever is passed to exit/1
as the "exit reason"
Commands
erl
catch exit(reason)
Output
{'EXIT', reason}