anchor.diff:  handle_loop(State) ->
       case read_user(State) of
           {ok, User, State1} ->
  -            case is_old_user(User) of
  -                true ->
  -                    %?INFO_MSG("SkipUser:~p",[User]),
  -                    {ok, State1, 0};
  -                false ->
  -                    %?INFO_MSG("CheckUser:~p",[User]),
  -                    {ok, State2} = transfer_roster(State1, User),
  -                    set_old_user(User),
  -                    {ok, State2, 1}
  +            case catch handle_user(State1, User) of
  +                {ok, NewState, Add} ->
  +                    {ok, NewState, Add};
  +                Other ->
  +                    {retry, State1, User, Other}
               end;
           {error, Reason} ->
               {error, Reason}
  +    end.
  +
  +handle_user(State, User) ->
  +    case is_old_user(User) of
  +        true ->
  +            %%?INFO_MSG("SkipUser:~p",[User]),
  +            {ok, State, 0};
  +        false ->
  +            %%?INFO_MSG("CheckUser:~p",[User]),
  +            {ok, State2} = transfer_roster(State, User),
  +            set_old_user(User),
  +            {ok, State2, 1}
       end.
   
   transfer_roster(#state{now_offset = NowOffset, 
  
positive.code:         [] ->
              false;
          {error, Reason} ->
              throw({retry, {dets_fail, User, Reason}})
      end.
  
  set_old_user(User) ->
  
negative.code:                         ok ->
                              {ok, State#state{transfer_cnt = TransferCnt+1}};
                          {error, Reason} ->
                              throw({transfer_roster_fail, Reason})
                      end
              end;
          false ->
              throw({read_roster_fail, RdsRosters, PikaRosters})
      end.
  
  is_need_transfer(RdsRosters, PikaRosters) when length(RdsRosters) > length(PikaRosters) ->
  