Throw or return a tuple

Ulf Wiger ulf@REDACTED
Sat Aug 13 23:15:55 CEST 2005


Den 2005-08-13 22:58:47 skrev <orbitz@REDACTED>:

> The try/catch syntax seems to be a lot ebtter than case catch.  Does it  
> still have some common limitations that one should watch out for?

Well, one thing to consider if you decide to use
"assertion-style" programming with pattern-matching,
is that it can sometimes be difficult to know where
in a function a crash occured:

copy_file(F1, F2) ->
   {ok, Fd1} = file:open(F1, read),
   {ok, Fd2} = file:open(F2, write),
   copy_chunks(Fd1, Fd2).

If the above function exits with e.g. a
{badmatch, {error, eaccess}}, it can be difficult
to know which operation caused the problem.

There are ways to get around this. Either refactor,
and make (in this case) a helper function for open(),
or find innovative ways to wrap your statements:

copy_file(F1, F2) ->
   {_, {ok, Fd1}} = {F1, file:open(F1, read)},
   {_, {ok, Fd2}} = {F2, file:open(F2, write)},
   copy_chunks(Fd1, Fd2).

would instead give you an error message like this one:

** exited: {{badmatch,{"foo.txt",{error,enoent}}},
             [{f,copy,2},
              {erl_eval,do_apply,5},
              {shell,exprs,6},
              {shell,eval_loop,3}]} **

/Uffe
-- 
Ulf Wiger



More information about the erlang-questions mailing list