Форум: "Начинающим";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];
ВнизДалать что-то, если N раз возникнет исключение, то raise его. Найти похожие ветки
← →
Kolan © (2007-06-01 15:19) [0]Проверьте правильно ли?
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;
← →
Kolan © (2007-06-01 15:25) [1]Вот отладил имхо алгоритм верный, но вот, как я думаю, те две строки за которые я попасался дают в итоге AV
← →
Anatoly Podgoretsky © (2007-06-01 15:25) [2]> Kolan (01.06.2007 15:19:00) [0]
Нормально
← →
Kolan © (2007-06-01 15:30) [3]> Нормально
Что-то нетак.
Добавил лог: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:31) [4]> А в итоге вижу Access Violation — странно…
Вот то что вижу:{Общая информационная команда для пользователя. Cтрока: «Access violation at address 00404A24 in module "KAcousticPressureConverter.exe". Read of address 00000000». | TCustomUserMessageCommand}.
← →
b z (2007-06-01 15:35) [5]както так
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;
← →
b z (2007-06-01 15:36) [6]Result := 1; - это для наглядности
← →
Kolan © (2007-06-01 15:39) [7]> if (i = TriesCount) then begin
Такая идея и возникла, а нах мне тогда цикл до TriesCount… Выглядит как-то страно, имхо…
← →
b z (2007-06-01 15:42) [8]а по мне
Exit;
except
on E: Exception do
TempException := E
end;
end;
Package.Free;
raise TempException;
страннее намного :)
← →
Kolan © (2007-06-01 15:46) [9]> а по мне
> Exit;
Ну Exit, то все равно нужен. Сделал как вы предложили — вроде работает, но на понятно почему не работал сабж. Хотелось бы понять…
← →
b z (2007-06-01 15:56) [10]
> Kolan © (01.06.07 15:46) [9]
имелось ввиду не только Exit;, но и все остальное
да и в моей версии его (Exit;) нет
но только вы знаете все ньюансы
> Хотелось бы понять…
т.к. объект уже разрушен. тут надо "клонировать" если оставлять ваш вариант, или еще как ...
:)
← →
Kolan © (2007-06-01 15:58) [11]> т.к. объект уже разрушен.
А можно подробнее, почему и где оно(исключение) разрушилось?
← →
Leonid Troyanovsky © (2007-06-01 16:40) [12]
> 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 16:43) [13]> Твой хелп затерся до дыр?
:-[
> Во-ще-то, IMHO, топик и приведенный в [0] код коррелируют
> слабо.
Тут старался как мог, лучьше названия не придумал…
Благодарю, я разобрался.
← →
Anatoly Podgoretsky © (2007-06-01 18:32) [14]Никакого
16617 15:23:22:144 Записано в COM порт:
В коде не наблюдается, зато наблюдается глобальная переменная Package
Кол естественно можно улучшить, например Package.Free вынести в finally end, а raise TempException; в except end с анализом на I = 3
← →
b z (2007-06-01 19:35) [15]
> Kolan © (01.06.07 15:58) [11]
извините надо было по городу побегать - дела порешать, но вам уже все пояснили.
> Anatoly Podgoretsky © (01.06.07 18:32) [14]
> глобальная переменная Package
или пришла параметром, да и ваще странный код :)
← →
Kolan © (2007-06-02 09:03) [16]> или пришла параметром
Угу
> наблюдается глобальная переменная
Я такими вещами не занимаюсь :)
> да и ваще странный код :)
Почему? Просто все лишенне убрал…
Ладно вопрос закрыт. Благодарю за обсуждение.
← →
Anatoly Podgoretsky © (2007-06-02 10:59) [17]> наблюдается глобальная переменная
> Я такими вещами не занимаюсь :)
Чем же ты тогда занимаешься, трепологией или все таки хочешь обсуждать свою проблему?
> Почему? Просто все лишенне убрал…
Обсуждать можно только то что ты привел, телепатия это на другом форуме.
← →
Loginov Dmitry © (2007-06-02 12:00) [18]> raise TempException;
а разве объект исключения не разрушился сразу после окончания except...end ?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.039 c