-module(addressbook_exception). -export([start/0,addressbook/1]). start() -> register(addressbook, spawn(addressbook_exception, addressbook, [[]])). addressbook(Data) -> receive {From, {addUser, Name, Email}} -> case catch add(Name, Email, Data) of {ab_exception, user_exists} -> From ! {addressbook, no}, addressbook(Data); NewData-> From ! {addressbook, ok}, addressbook(NewData) end; {From, {getName, Email}} -> From ! {addressbook, getname(Email, Data)}, addressbook(Data); {From, {getEmail, Name}} -> From ! {addressbook, getemail(Name, Data)}, addressbook(Data) end. add(Name, Email, Data) -> case getemail(Name, Data) of undefined -> [{Name,Email}|Data]; _ -> % if Name already exists, exception is thrown. throw({ab_exception,user_exists}) end. getname(Email, [{Name, Email} | _Data]) -> Name; getname(Email, [_H | Data]) -> getname(Email, Data); getname(_Email, []) -> undefined. getemail(Name, [{Name, Email} | _Data]) -> Email; getemail(Name, [_H|Data]) -> getemail(Name, Data); getemail(_Name, []) -> undefined. %% Usage: % % % erl -name addressbook@127.0.0.1 % % (addressbook@127.0.0.1)1> addressbook_exception:start(). %