[erlang-questions] Best practices for handling invalid / unexpected messages

Jachym Holecek <>
Fri May 13 21:59:20 CEST 2011


# Ciprian Dorin Craciun 2011-05-13:
>     Lately I've started programming a bit more seriously in Erlang,
> and after creating a few `gen_server` or `gen_fsm` components, I've
> started wondering what is the best way to handle unexpected or invalid
> requests / messages. [...]
> 
>     I think of three possibilities:
>     * reply back with an error:

Yep, this is what I do:

  handle_call(_, _, State) ->
      {reply, {error, bad_request}, State}.

  handle_info(_, State) ->
      {noreply, State}.

It's similar with gen_fsm & custom processes.

>     Now each of these have advantages or disadvantages:
>
>     * the first one is "polite" to the caller, letting him retry,
>       but could lead to hidden bugs if the caller doesn't check
>       the return term;

It also helps forward-compatibility in presence of hot code upgrades.

>     Furthermore, let's say a process depends in his operation on
> another process, should it link the dependency process, should it
> monitor, or should it just fail on call?

Depends on how tightly they're bound together. Linking them means "one
can't live without the other even for a second", monitoring means "one
is vaguely interested if the other is still alive" (often to clean up
some mess when the other dies), fail on call means "ok, I need you to
handle my request now, but generally I don't really care about you".

The last option is by far the most common, the other two are employed
tactically in cases where it matters.

HTH,
	-- Jachym



More information about the erlang-questions mailing list