logo       

Re: catching errors from linked processes: simplest way?: msg#00328

lang.erlang.general

Subject: Re: catching errors from linked processes: simplest way?

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@xxxxxxxxxxxxx> 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




<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise