![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Далать что-то, если N раз возникнет исключение, то raise его.
Kolan © (2007-06-01 15:19:00)Проверьте правильно ли?
const
TriesCount = 3;
var
Tries: Byte;
I: Integer;
TempException: Exception;
begin
for I := 1 to TriesCount do
begin
try
Result := RequestDeviceOnce(Package, TimeOut);
Package.Free;
Exit;
except
on E: Exception do
TempException := E
end;
end;
Package.Free;
raise TempException;
end;
То есть приRequestDeviceOnceтижды возникнет ошибка, то только тогда её надо выдать дальше.
Не уверен в:
TempException := E
raise TempException;
Loginov Dmitry (2007-06-02 12:00:00) [1]> raise TempException;
а разве объект исключения не разрушился сразу после окончания except...end ?
Anatoly Podgoretsky (2007-06-02 10:59:00) [2]> наблюдается глобальная переменная
> Я такими вещами не занимаюсь :)
Чем же ты тогда занимаешься, трепологией или все таки хочешь обсуждать свою проблему?
> Почему? Просто все лишенне убрал…
Обсуждать можно только то что ты привел, телепатия это на другом форуме.
Kolan (2007-06-02 09:03:00) [3]> или пришла параметром
Угу
> наблюдается глобальная переменная
Я такими вещами не занимаюсь :)
> да и ваще странный код :)
Почему? Просто все лишенне убрал
Ладно вопрос закрыт. Благодарю за обсуждение.
b z (2007-06-01 19:35:00) [4]
> Kolan © (01.06.07 15:58) [11]
извините надо было по городу побегать - дела порешать, но вам уже все пояснили.
> Anatoly Podgoretsky © (01.06.07 18:32) [14]
> глобальная переменная Package
или пришла параметром, да и ваще странный код :)
Anatoly Podgoretsky (2007-06-01 18:32:00) [5]Никакого
16617 15:23:22:144 Записано в COM порт:
В коде не наблюдается, зато наблюдается глобальная переменная Package
Кол естественно можно улучшить, например Package.Free вынести в finally end, а raise TempException; в except end с анализом на I = 3
Kolan (2007-06-01 16:43:00) [6]> Твой хелп затерся до дыр?
:-[
> Во-ще-то, IMHO, топик и приведенный в [0] код коррелируют
> слабо.
Тут старался как мог, лучьше названия не придумал
Благодарю, я разобрался.
Leonid Troyanovsky (2007-06-01 16:40:00) [7]
> Kolan © (01.06.07 15:58) [11]
> А можно подробнее, почему и где оно(исключение) разрушилось?
Что такое, товарищи, "идея", и что такое, братья, "дебют".
Твой хелп затерся до дыр?
The exception object is then automatically destroyed through a call to its Destroy destructor and control is passed to the statement following the try...except statement. (If a call to the Exit, Break, or Continue standard procedure causes control to leave the exception handler, the exception object
is still automatically destroyed.)
Во-ще-то, IMHO, топик и приведенный в [0] код коррелируют слабо.
--
Regards, LVT.
Kolan (2007-06-01 15:58:00) [8]> т.к. объект уже разрушен.
А можно подробнее, почему и где оно(исключение) разрушилось?
b z (2007-06-01 15:56:00) [9]
> Kolan © (01.06.07 15:46) [9]
имелось ввиду не только Exit;, но и все остальное
да и в моей версии его (Exit;) нет
но только вы знаете все ньюансы
> Хотелось бы понять…
т.к. объект уже разрушен. тут надо "клонировать" если оставлять ваш вариант, или еще как ...
:)
Kolan (2007-06-01 15:46:00) [10]> а по мне
> Exit;
Ну Exit, то все равно нужен. Сделал как вы предложили вроде работает, но на понятно почему не работал сабж. Хотелось бы понять
b z (2007-06-01 15:42:00) [11]а по мне
Exit;
except
on E: Exception do
TempException := E
end;
end;
Package.Free;
raise TempException;
страннее намного :)
Kolan (2007-06-01 15:39:00) [12]> if (i = TriesCount) then begin
Такая идея и возникла, а нах мне тогда цикл до TriesCount Выглядит как-то страно, имхо
b z (2007-06-01 15:36:00) [13]Result := 1; - это для наглядности
b z (2007-06-01 15:35:00) [14]както так
const
TriesCount = 3;
var
Tries: Byte;
I: Integer;
begin
Result := 1;
for I := 1 to TriesCount do
try
Result := RequestDeviceOnce(Package, TimeOut);
FreeAndNil(Package);
except
on E: Exception do
if (i = TriesCount) then begin
FreeAndNil(Package);
raise;
end;
end;
end;
Kolan (2007-06-01 15:31:00) [15]> А в итоге вижу Access Violation — странно…
Вот то что вижу:
{Общая информационная команда для пользователя. Cтрока: «Access violation at address 00404A24 in module 'KAcousticPressureConverter.exe'. Read of address 00000000». | TCustomUserMessageCommand}.
Kolan (2007-06-01 15:30:00) [16]> Нормально
Что-то нетак.
Добавил лог:
except
on E: Exception do
begin
//
LogManager.WriteString('Ошибка при приёме/передачи пакета' + ': ' + E.Message);
//
TempException := E;
end;
end;
Вот он
16616 15:23:22:144 Ошибка при приёме передачи пакета: Время ожидания вышло.//Раз ошибка
16617 15:23:22:144 Записано в COM порт:
16618 15:23:23:941 Ошибка при приёме передачи пакета: Время ожидания вышло.//Два ошибка
16619 15:23:23:941 Записано в COM порт:
16620 15:23:25:738 Ошибка при приёме передачи пакета: Время ожидания вышло.//Три ошибка
А в итоге вижу Access Violation странно
Kolan (2007-06-01 15:25:00) [17]Вот отладил имхо алгоритм верный, но вот, как я думаю, те две строки за которые я попасался дают в итоге AV
Anatoly Podgoretsky (2007-06-01 15:25:00) [18]> Kolan (01.06.2007 15:19:00) [0]
Нормально