Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Далать что-то, если 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]

Нормально


Наверх

Титульная страница Поиск, карта сайта Написать письмо