Исключения (Delphi)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by mironich, 6 Apr 2012.

  1. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    (Delphi)

    ?
    , .
    ?
    Synapce , + zlib .
    ** , ?
    - .
    , http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=248663&hl=
    http://habrahabr.ru/post/130535/
    , , http://habrahabr.ru/post/119016/
     
    #1 mironich, 6 Apr 2012
    Last edited: 25 Mar 2013
  2. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    1) поднимаемаеш исключения только в действительно исключительных ситуациях

    2) вместо обработки исключений, делай проверки.
    напр.:
    вместо
    Code:
    try
      Result := List.Item['fff'];
    except
      Result := '';
    end;
    став
    Code:
    if List.Contain['fff'] then
      Result := List.Item['fff']
    else
      Result := '';
    думаю этого нужно избежать (если, конечно, для этого не нужно править чужие либы)
     
    #2 ADR-007, 6 Apr 2012
    Last edited: 6 Apr 2012
    1 person likes this.
  3. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    В общем в каких ситуациях использую, есть софт для определенных действий с акаунтами, если акаунт невалид исключение, если локнутый исключение , если прокси плохая исключение, собственно писал на сонную голову первый пост, сча как увидел огород из try except поправил. Перечитал статью по обработке исключений и все встало на свои места)
     
  4. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    хм... не понимаю почему много try except, все же на функи делится...

    типа:
    Code:
    function GetWorkProxy:TProxyRec;
    begin
      //...
      if trata then 
        raise Exception.Create('Work proxy not exsits!');
      //...
    end;
    
    
    procedure Auth(Account: TAccountRec; Proxy: TProxyRec); overload;
    begin
      //...
      // исключения от IdHTTP...
      if tratat then
        raise Exception.Create('Auth Error');
    end;
    
    
    procedure Auth(Account: TAccount); overload;
    begin
      Auth(Account, GetWorkProxy);
    end;
    
    begin
      try
        Auth(Account);
      except
        on E:Exception do
        begin
          WriteToLog(E);
          AuthButton.Enable := True;
          //...
          raise;
        end;
      end;
    end;
     
  5. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Ну у меня архитектура класса оч кривая была, теперь происходит так.
    Процедура main вызывает процедуру Auth если возникает исключение связанное с HTTP протоколом оно его обрабатывает делает запись в лог, возвращает соответствующий код, и заканчивает выполнение,
    если искл. связано с акаунтами оно перехватываться выше main в коде потока там обрабатывается и выполняются соответствующие действия.
    А тру Except было много т.к каждый вызов процедуры оборачивал тру ехцепт(процедуры которая могла вызвать искл.) теперь. они все перехватываются и обрабатываться в main.
     
  6. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    ну я все исключения записываю в лог)

    а какая разница? в смисле, что там обрабатывать?
    плох пароль? - Exception.Create('Плох пароль!'). Нет рабочих прокси? - Exception.Create('нет рабочих прокси');


    у меня 99% ошибок идет в самый верх, т. к. если все ок то исключений не возникает.

    и еще... не игнорируй неизвестные ошибки =)


    мне были код дали в качестве примера того что надо сделать. Так там... ну просто пример того что не стоит делать)
    что то типа
    function NameInList(Name: string): Boolean;
    begin
    try
    List.Items[Name];
    Result := True;
    except
    Result := False;
    end;
    end;
     
    #6 ADR-007, 7 Apr 2012
    Last edited: 7 Apr 2012
  7. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    НУ в классе обрабатываюца http и т д искл. дабы не переносить их обработку в поток, чтоб код потока был более лаконичным, и только основные там обрабатывать.
     
  8. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    Я имею ввиду что у меня, обычно, все равно что это за ошибка. Если она прошла так высоко значить она фатальна и нет смысла ее по особому обрабатывать. Только запись в лог.

    Ну это уже надо код видеть чтобы сказать своё ИМХО =)
     
Loading...