Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 968

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Как обработать возможные ошибки в блоке try finally без выходя из приложения и процедуры. У меня всё выполняется в цикле, поэтому нужно обработать все файлы.

Пример в приложении.

Приложение:
  1. if Files.Count > 0 then
  2. for i := 0 to Files.Count - 1 do
  3. begin
  4. if InputInfo = nil then
  5. InputInfo := GetMemory(sizeof(TInputInfo));
  6. ZeroMemory(InputInfo, sizeof(TInputInfo));
  7.  
  8. try
  9.  
  10. InputInfo.Handle := LoadLibrary(PAnsiChar(Files.Strings[i]));
  11.  
  12. if InputInfo.Handle = 0 then raise;
  13.  
  14. @GetInputProc := GetProcAddress(InputInfo.Handle, 'GetInput'); //Do not localize
  15.  
  16. if not Assigned(GetInputProc) then raise;
  17.  
  18. GetInputProc(InputInfo.Input);
  19.  
  20. if InputInfo.Input = nil then raise;
  21. CopyPChar(InputInfo.FileName, Files.Strings[i]);
  22. CopyPChar(InputInfo.Name, InputInfo.Input.GetName);
  23. if not InputInfo.Input.Init(PChar(Files.Strings[i]), Self) then raise;
  24. fInputs.Add(InputInfo);
  25. InputInfo := nil;
  26.  
  27. finally
  28. if InputInfo <> nil then
  29. begin
  30. FreePChar(InputInfo.FileName);
  31. FreePChar(InputInfo.Name);
  32. FreeMemory(InputInfo);
  33. end;
  34.  
  35. @GetInputProc := nil;
  36. FreeLibrary(InputInfo.Handle);
  37. end;
  38. end;
  39.  
  40. 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™

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]:

Я разобрался. Спасибо!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.02 сек.