[erlang-questions] Programming question

Sean Hinde <>
Thu Jan 25 13:26:43 CET 2007


On 25 Jan 2007, at 12:08, Mats Cronqvist wrote:

> Sean Hinde wrote:
>>
>> On 25 Jan 2007, at 08:23, Mats Cronqvist wrote:
>>
>>> Sean Hinde wrote:
>>>>
>>>> One fix might be for gen:call() to issue another exit signal  
>>>> towards
>>>> the calling process after returning the result.
>>>
>>>    surely if you catch the exit and it turns out you really  
>>> wanted it,
>>> you
>>> should re-throw?
>>>
>>>    how about
>>>
>>> try
>>>    Res = gen_server:call(PidA, {op, stuff}),
>>>    S1 = process(Res, S),
>>>    loopB(PidA, S1)
>>> catch
>>>    C:R ->
>>>      case is_process_alive(PidA) of
>>>        true -> loopB(PidA,dosomething({C,R},S));
>>>        false -> exit({C,R})
>>>      end
>>> end
>>
>> This would work, but my is it ugly -
>
>    hey! it took me several seconds to write that code! some respect  
> please :>

Heh Heh. OK, It's beautiful code, if it makes you feel better, but as  
a required construct it is still ugly :-)


>>
>> The problem as I see it is that the calling process only sometimes  
>> get
>> its 'EXIT' message - it depends on context.
>
>    but it does get it's exit message. always. the "context" is that  
> you catch it
> and throw it away...

No! Receiving an exit message is different to catching an exception.  
The problem is that the gen_server:call mechanism does just that, it  
catches an exit message from the called process and turns it into a  
simple exception.

This is why I suggest that *if* the exception thrown by  
gen_server:call was actually caused by an exit message from the  
called process then the gen_server should throw the exception *and*  
resend the EXIT message to the called process.

Sean






More information about the erlang-questions mailing list