Structs

Ulf Wiger <>
Thu Jan 16 13:38:48 CET 2003


On Thu, 16 Jan 2003, Luke Gorrie wrote:

>I still have problems in Erlang in the cases where I don't
>want to crash, i.e. the non-assertion type of error
>detection. Here's a function I wrote recently:

If the philosophy of making functions return a correct value
or exit were followed more consistently, one only needs to
catch exceptions at the top and format a nice message.

The following implementation avoids the indentation misery.
We have to wrap some functions to give them correct-or-exit
semantics.

/Uffe

connect(Host, User, Password) ->
    case catch
	begin
	    Pid = open(Host),
	    user(Pid, User, Password),
	    Home = pwd(Pid),
	    type(Pid, binary),
	    {ok, Pid, Home}
	end of
	{'EXIT', Reason} -> {error,
otp_ftp:formaterror(Reason)};
	Result ->
	    Result
    end.

open(Host) ->
    ok_value(otp_ftp:open(Host)).
user(Pid, User, Password) ->
    ok(otp_ftp:user(Pid, User, Password)).
pwd(Pid) ->
    ok_value(otp_ftp:pwd(Pid)).
type(Pid, Type) ->
    ok(otp_ftp:type(Pid, Type)).

ok_value({ok, Result}) ->	Result;
ok_value({error, Reason}) ->	exit(Reason).

ok(ok) ->		ok;
ok({error, Reason}) ->	exit(Reason).



>  connect(Host, User, Password) ->
>      case otp_ftp:open(Host) of
>          {ok, Pid} ->
>              link(Pid),
>              case otp_ftp:user(Pid, User, Password) of
>                  ok ->
>                      case otp_ftp:pwd(Pid) of
>                          {ok, Home} ->
>                              ?event(ftp, "~p: Home is ~p", [self(), Home]),
>                              case otp_ftp:type(Pid, binary) of
>                                  ok ->
>                                      %% It is at about this level of nesting
>                                      %% that better exception handling in
>                                      %% erlang becomes appetizing..
>                                      {ok, Pid, Home};
>                                  {error, Rsn} ->
>                                      {error, otp_ftp:formaterror(Rsn)}
>                              end;
>                          {error, Rsn} ->
>                              {error, otp_ftp:formaterror(Rsn)}
>                      end;
>                  {error, Rsn} ->
>                      {error, otp_ftp:formaterror(Rsn)}
>              end;
>          {error, Rsn} ->
>              {error, otp_ftp:formaterror(Rsn)}
>      end.
>
>Cheers,
>Luke
>
>

-- 
Ulf Wiger, Senior Specialist,
   / / /   Architecture & Design of Carrier-Class Software
  / / /    Strategic Product & System Management
 / / /     Ericsson Telecom AB, ATM Multiservice Networks




More information about the erlang-questions mailing list