|
Вопрос # 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]:
Я разобрался. Спасибо!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|