Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

Далать что-то, если 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 — странно&#133


 
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&#133 Выглядит как-то страно, имхо&#133


 
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, то все равно нужен. Сделал как вы предложили — вроде работает, но на понятно почему не работал сабж. Хотелось бы понять&#133


 
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] код коррелируют
> слабо.

Тут старался как мог, лучьше названия не придумал&#133

Благодарю, я разобрался.


 
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]

> или пришла параметром

Угу


> наблюдается глобальная переменная

Я такими вещами не занимаюсь :)


> да и ваще странный код :)

Почему? Просто все лишенне убрал&#133

Ладно вопрос закрыт. Благодарю за обсуждение.


 
Anatoly Podgoretsky ©   (2007-06-02 10:59) [17]

> наблюдается глобальная переменная

> Я такими вещами не занимаюсь :)

Чем же ты тогда занимаешься, трепологией или все таки хочешь обсуждать свою проблему?

> Почему? Просто все лишенне убрал…

Обсуждать можно только то что ты привел, телепатия это на другом форуме.


 
Loginov Dmitry ©   (2007-06-02 12:00) [18]

> raise TempException;


а разве объект исключения не разрушился сразу после окончания except...end ?



Страницы: 1 вся ветка

Текущий архив: 2007.06.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
2-1180461397
sdedwqe
2007-05-29 21:56
2007.06.24
record


15-1180012314
Valkyre
2007-05-24 17:11
2007.06.24
Developer Studio. Сист. требования


15-1180136574
ЭРИКА
2007-05-26 03:42
2007.06.24
С ДНЕМ СВАДЬБЫ!


1-1177498600
Грициан
2007-04-25 14:56
2007.06.24
Что неверно в этом коде?


2-1180523061
_vl_
2007-05-30 15:04
2007.06.24
Ссылка на массив