catching errors from linked processes: simplest way?
Raimo Niskanen
raimo.niskanen@REDACTED
Wed Apr 23 08:34:48 CEST 2003
You could add some supervision to the client by using a toplevel catch.
Then you will get a stack dump. The following code also demonstrates a
line number macro trick with the process dictionary that is possible if
you have a toplevel catch in the client.
Runtime result:
21> test:top().
{'EXIT',{{badmatch,b},
[{test,foo,0},
{test,do,0},
{test,top,0},
{erl_eval,expr,3},
{erl_eval,exprs,4},
{shell,eval_loop,2}]}} at test:22
error
/ Raimo Niskanen, Erlang/OTP, Ericsson AB
-module(test).
-export([top/0]).
-define(line, put(location,{?MODULE,?LINE}),).
top() ->
?line
case catch do() of
{'EXIT',_} = Exit ->
{Module,Line} = get(location),
io:format("~p at ~w:~w~n", [Exit,Module,Line]),
error;
Result ->
{ok,Result}
end.
do() ->
?line foo(),
?line bar().
foo() ->
?line a=b.
bar() ->
ok.
Chris Pressey wrote:
> On Tue, 22 Apr 2003 15:35:16 -0500
> Chris Pressey <cpressey@REDACTED> wrote:
>
>
>>If I do the translation in the client, I would have:
>>
>> foo(A, B) ->
>> case A of
>> true ->
>> bar(B);
>> false ->
>> throw(only_applies_under_condition_a)
>> end.
>>
>>which is hardly any improvement over the original.
>
>
> Ah! I think I see a compromise: notify the supervisor of the nature of
> any potential upcoming errors. So the code becomes something like:
>
> foo(A, B) ->
> supervisor:potential_error(only_applies_under_condition_a, [A,B]),
> A = true, bar(B).
>
> where supervisor:potential_error/2 sends a message to the supervisor,
> which stores it in a dictionary using the pid the message came from as
> the key, and which retrieves it when an error actually does occur.
>
> The code is still fairly easy to read, and the supervisor doesn't need
> to know about the structure of the code it's supervising, yet it can
> know some details about what state the process was in when it crashed.
>
> Sweet!
>
> -Chris
More information about the erlang-questions
mailing list