(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) поднимаемаеш исключения только в действительно исключительных ситуациях 2) вместо обработки исключений, делай проверки. напр.: вместо Code: try Result := List.Item['fff']; except Result := ''; end; став Code: if List.Contain['fff'] then Result := List.Item['fff'] else Result := ''; думаю этого нужно избежать (если, конечно, для этого не нужно править чужие либы)
В общем в каких ситуациях использую, есть софт для определенных действий с акаунтами, если акаунт невалид исключение, если локнутый исключение , если прокси плохая исключение, собственно писал на сонную голову первый пост, сча как увидел огород из try except поправил. Перечитал статью по обработке исключений и все встало на свои места)
хм... не понимаю почему много 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;
Ну у меня архитектура класса оч кривая была, теперь происходит так. Процедура main вызывает процедуру Auth если возникает исключение связанное с HTTP протоколом оно его обрабатывает делает запись в лог, возвращает соответствующий код, и заканчивает выполнение, если искл. связано с акаунтами оно перехватываться выше main в коде потока там обрабатывается и выполняются соответствующие действия. А тру Except было много т.к каждый вызов процедуры оборачивал тру ехцепт(процедуры которая могла вызвать искл.) теперь. они все перехватываются и обрабатываться в main.
ну я все исключения записываю в лог) а какая разница? в смисле, что там обрабатывать? плох пароль? - Exception.Create('Плох пароль!'). Нет рабочих прокси? - Exception.Create('нет рабочих прокси'); у меня 99% ошибок идет в самый верх, т. к. если все ок то исключений не возникает. и еще... не игнорируй неизвестные ошибки =) мне были код дали в качестве примера того что надо сделать. Так там... ну просто пример того что не стоит делать) что то типа function NameInList(Name: string): Boolean; begin try List.Items[Name]; Result := True; except Result := False; end; end;
НУ в классе обрабатываюца http и т д искл. дабы не переносить их обработку в поток, чтоб код потока был более лаконичным, и только основные там обрабатывать.
Я имею ввиду что у меня, обычно, все равно что это за ошибка. Если она прошла так высоко значить она фатальна и нет смысла ее по особому обрабатывать. Только запись в лог. Ну это уже надо код видеть чтобы сказать своё ИМХО =)