| 
| 
 | Вопрос # 2 968/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Как обработать возможные ошибки в блоке try finally без выходя из приложения и процедуры. У меня всё выполняется в цикле, поэтому нужно обработать все файлы.
 
 Пример в приложении.
 Приложение:Переключить в обычный режим if Files.Count > 0 then  for i := 0 to Files.Count - 1 do  begin    if InputInfo = nil then      InputInfo := GetMemory(sizeof(TInputInfo));    ZeroMemory(InputInfo, sizeof(TInputInfo));     try       InputInfo.Handle := LoadLibrary(PAnsiChar(Files.Strings[i]));       if InputInfo.Handle = 0 then raise;       @GetInputProc := GetProcAddress(InputInfo.Handle, 'GetInput'); //Do not localize       if not Assigned(GetInputProc) then raise;       GetInputProc(InputInfo.Input);       if InputInfo.Input = nil then raise;      CopyPChar(InputInfo.FileName, Files.Strings[i]);      CopyPChar(InputInfo.Name, InputInfo.Input.GetName);      if not InputInfo.Input.Init(PChar(Files.Strings[i]), Self) then raise;      fInputs.Add(InputInfo);      InputInfo := nil;     finally      if InputInfo <> nil then      begin        FreePChar(InputInfo.FileName);        FreePChar(InputInfo.Name);        FreeMemory(InputInfo);      end;       @GetInputProc := nil;      FreeLibrary(InputInfo.Handle);    end;  end;   Files.Free;
|  |   Вопрос задал: Виталий (статус: 2-ой класс)Вопрос отправлен: 3 июля 2009, 13:11
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Виталий!Обработать все ошибки да ещё в цикле? тогда наверное поможет такая конструкция
 
 for ... to .. do begin
try
try
//здесь основная работа
except
//ошибки здесь. можно селективно обрабатывать ошибки
end;
finally
// здесь можно удалять объекта, созданные выше
end;
end;Ошибки можно обрабатывать по типам. Для этого применяется конструкция типа on E:ExceptionType do begin
 
 end
 Также полезной вещью может оказаться возможность сгенерировать исключения самостоятельно. Для этого применяется ключевое слово raise.  Более того (я такое иногда применял), можно делать "перевыброс исключения" - когда в обработчике исключения делается вызов raise - тогда он будет перехвачен следующим except
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 3 июля 2009, 13:37
 Оценка за ответ: 5
 Комментарий к оценке: Ну как раз подобное мне и нужно. Ещё мне нужно, чтобы эти сообщения о ошибках не выдавались. И как вызвать выход из try except вручную.  |  
 Мини-форум вопросаВсего сообщений: 7; последнее сообщение — 3 июля 2009, 20:26; участников в обсуждении: 3. 
|   | Виталий (статус: 2-ой класс), 3 июля 2009, 13:51 [#1]:Мне нужно, чтобы эти сообщения о ошибках не выдавались. И как вызвать выход из try except вручную. |  
|   | Вадим К (статус: Академик), 3 июля 2009, 14:52 [#2]:оставить  пустой try except и никаких сообщений. Хотя это и не совсем правильно. А то что делфи останавливается и выводит сообщение - так не надо с под отладчика запускать.
 А вот что такое "выход вручную" - надо понимать логику работы этого всего. Надо так проектировать, что бы этот выход не нужен был.
 Если например есть десять вложенных try finally, и мы делаем с середины выход по exit, то сработают все блоки finally. И это идеологически правильно.
 Хотя попробуйте обяснить поподробнее, что хочеться под словом "выход вручную".
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 3 июля 2009, 16:32 [#3]: Цитата (Виталий): Мне нужно, чтобы эти сообщения о ошибках не выдавались. Отключи их вывод в Debugger options -> Language exceptions -> Stop on delphi exceptions.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Виталий (статус: 2-ой класс), 3 июля 2009, 18:16 [#4]:Выход вручную значит сгенерировать исключение, чтобы выйти из блока в любой момент. |  
|   | Виталий (статус: 2-ой класс), 3 июля 2009, 18:22 [#5]:Но чтобы он не вышел из функции. |  
|   | Вадим К (статус: Академик), 3 июля 2009, 18:58 [#6]:я уже написал - вызвать raise. он до первого блока except
 Если этот блок внутри функции, то выхода не будет. а просто обработается блок except-end и дальше за ним.
 И если код, как я в примере выше писал, то цикл будет бегать. Но так как это цикл, то тут хорошо использовать continue (finally блок внутри цикла будет обрабатываться) и break для выхода с цикла.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Виталий (статус: 2-ой класс), 3 июля 2009, 20:26 [#7]:Я разобрался. Спасибо! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |