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

Ciprian Dorin Craciun ciprian.craciun@REDACTED
Fri May 13 20:46:51 CEST 2011


    Hello all!

    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. (For example in `handle_call`, or `handle_info`
or state handlers.) (By invalid requests I mean those that have the
correct form (i.e. a tuple `{add, A, B}`) but invalid syntax (i.e. `A`
is an atom); by unexpected messages I mean those that fail to even
loosely match a valid pattern (i.e. `{some_unrecognized_operation, A,
B}`.)

    I think of three possibilities:
    * reply back with an error:
~~~~
handle_call (Request, _Sender, State) -> {reply, {error,
{invalid_request, Request}}, State}.
~~~~
    * exit with an error;
~~~~
handle_call (Request, _Sender, State) -> {stop, {error,
{invalid_request, Request}}, State}.
~~~~
    * don't even create a special catch-all case and just let the
process fail with `function_clause` error;

    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;
    * the second one I think fits more the Erlang philosophy of
"let-it-crash", but could lead to state loss (i.e. an ETS table);
    * the last one I consider to be just rude as it doesn't give any
information on why it failed;

    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?

    So I ask the other Erlang developers how do they handle these situations?

    Thanks,
    Ciprian.



More information about the erlang-questions mailing list