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

Вниз

Обработка ошибок   Найти похожие ветки 

 
картман ©   (2010-01-20 11:55) [0]

Всем доброго времени суток!
 Есть программа. Постоянно загружена в память(потом на сервис переделаю). Занимается обработкой поступающих данных по таймеру:

procedure TfMain.tmrMain(Sender: TObject) ;
begin
 if function1 then
 begin
   procedure1;
   procedure2;
   ....
   procedureN;
 end;
end;

 Если в одной из процедур произойдет ошибка, как мне вернуть выполнение программы, в точку возникновения исключения, чтобы не потерять(точнее, не "забыть") результат? Все промежуточные данные сохраняются.


 
oldman ©   (2010-01-20 11:57) [1]


> Если в одной из процедур произойдет ошибка, как мне вернуть
> выполнение программы, в точку возникновения исключения


Переведи на понятный язык, пожалуйста...


 
Virgo_Style ©   (2010-01-20 12:07) [2]

Требуется повторять процедуру до тех пор, пока она не будет выполнена без ошибок, так что ли?

repeat
процедура
until без ошибок

:0)


 
Mike Kouzmine   (2010-01-20 12:14) [3]

картман ©   (20.01.10 11:55) Ты думаешь, что на второй раз она отработает без ошибок? Почему такая уверенность?


 
Mike Kouzmine   (2010-01-20 12:16) [4]

а так 1: try proc1 exept  begin goto 1 end


 
Anatoly Podgoretsky ©   (2010-01-20 12:22) [5]

> картман  (20.01.2010 11:55:00)  [0]

Раз исключение, то естественно, что надо использовать try except end


 
картман ©   (2010-01-20 12:22) [6]


> oldman ©   (20.01.10 11:57) [1]


procedure TfMain.tmrMain(Sender: TObject) ;
begin
if function1 then
begin
  procedure1;
  procedure2; // тут произошла ошибка,  
                   // значит обработку данных нужно начать с procedure2

  ....
  procedureN;
end;
end;


> Virgo_Style ©   (20.01.10 12:07) [2]



> Mike Kouzmine   (20.01.10 12:16) [4]

ну, может и так...


> Mike Kouzmine   (20.01.10 12:14) [3]

уверен.


 
Сергей М. ©   (2010-01-20 12:49) [7]


>   procedure2; // тут произошла ошибка,  
>                    // значит обработку данных нужно начать
> с procedure2
>


И получится "у попа была собака ..")


 
картман ©   (2010-01-20 13:06) [8]


> Сергей М. ©   (20.01.10 12:49) [7]

как сделать "У попа была, есть и будет собака"?


 
test ©   (2010-01-20 13:11) [9]

картман ©   (20.01.10 13:06) [8]
while(Function_2())do Sleep(200);

function function_2():boolean;
begin
Result := false;
try
............
Result := true;
except
 on e:Exception do Log.write(e.message);
end;
end;

Только за такое надо руки отрывать.


 
Сергей М. ©   (2010-01-20 13:12) [10]


> картман ©   (20.01.10 13:06) [8]


Ну ты сам-то подумай: в procedure2 у тебя возникло исключение, управление при этом передано в except-блок (т.е. началась обработка "ошибки"), в нем ты опять вызываешь procedure2, в которой у тебя опять возникло исключение, при котором управление вновь передано в except-блок, в котором ты опять вызываешь procedure2, в которой у тебя опять возникло исключение, ... и так до морковкиного заговения - до EStackOverflow ..)

Ты же, судя по изложенному, желаешь именно этого ?)


 
test ©   (2010-01-20 13:18) [11]

Сергей М. ©   (20.01.10 13:12) [10]
Точно так он будет получать много разнообразных ошибок!))

procedure Procedure_2();
begin
try
.......
except
Procedure_2();
end;
end;


 
картман ©   (2010-01-20 13:23) [12]


> Сергей М. ©   (20.01.10 13:12) [10]

 я желаю обрабатывать возникающие исключения так, чтобы не было потери данных и спрашиваю, как это сделать. Но ход Ваших мыслей мне нравится - люблю чернуху:)


> test ©   (20.01.10 13:11) [9]


> Только за такое надо руки отрывать.

Ну ты и садист - чем я метлу держать-то буду?


 
test ©   (2010-01-20 13:31) [13]

картман ©   (20.01.10 13:23) [12]

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

с сишников пример бери, вот как то так ИМХО
popitka := 0;
res :=  Function_2();
while((res != 0) or (popitka = 5))do
 begin
   case(res)of
      1: i := 0;
      2: slovo := "";
      ....
      999 : xxx:=nil;
   end;
   res :=  Function_2();
   inc(popitka);
   Sleep(200);
 end;

function function_2():integer;
begin
Result := 0;
try
............
except
Result := 1;
end;
try
............
except
Result := 2;
end;
try
............
except
Result := 3;
end;
try
............
except
Result := 4;
end;

end;


 
Сергей М. ©   (2010-01-20 13:32) [14]


> картман ©   (20.01.10 13:23) [12]


> чтобы не было потери данных


Прежде чем об этом рассуждать, нужно выяснить ПРИЧИНЫ, вызвавшие исключение при выполнении процедуры


 
картман ©   (2010-01-20 13:41) [15]


> test ©   (20.01.10 13:31) [13]

примерно так и думал...


> Сергей М. ©   (20.01.10 13:32) [14]

пока причина одна: плохая связь.


 
Игорь Шевченко ©   (2010-01-20 13:49) [16]

test ©   (20.01.10 13:31) [13]

Убивать. Медленно и с наслаждением.


 
картман ©   (2010-01-20 13:51) [17]


> Игорь Шевченко ©   (20.01.10 13:49) [16]

как бы увидеть то, за что можно погладить нежно?


 
Игорь Шевченко ©   (2010-01-20 13:56) [18]

картман ©   (20.01.10 13:51) [17]

А я так и не понял, чего ты хочешь


 
Сергей М. ©   (2010-01-20 13:59) [19]


> картман ©   (20.01.10 13:41) [15]


> причина одна: плохая связь.


И какие же данные потеряет процедура procedure2 при плохой связи ?

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

Я к тому что с этим ты должен определиться САМ, и лишь после этого формулировать вопрос .. а может он и сам по себе рассосется после самостоятельного анализа)..


 
картман ©   (2010-01-20 14:05) [20]


> Игорь Шевченко ©   (20.01.10 13:56) [18]


var
 ErrorCode: Integer = 0;

procedure Timer1Timer(Sender: TObject);
begin
 Main;
end;

procedure Main;
begin
 case ErrorCode of
    0, 1: begin
      proc1;
      proc2;
      proc3;
    end;
    2: begin
      proc2;
      proc3;
    end;

    3: begin
      proc3;
    end;
 end;
end;

procedure proc1;
begin
 try
   ...
 except
   ErrorCode := 1;
 end;
end;

procedure proc2;
begin
 try
   ...
 except
   ErrorCode := 2;
 end;
end;

procedure proc3;
begin
 try
   ...
 except
   ErrorCode := 3;
 end;
end;


 
Игорь Шевченко ©   (2010-01-20 14:07) [21]

картман ©   (20.01.10 14:05) [20]

Это че ?


 
картман ©   (2010-01-20 14:11) [22]


> Игорь Шевченко ©   (20.01.10 14:07) [21]

Возврат в ту процедуру, где при предыдущем выполнении возникла ошибка


 
test ©   (2010-01-20 14:16) [23]

Игорь Шевченко ©   (20.01.10 13:49) [16]
Хорошо как правильно попытаться исправить данные и запустить на выполнение?
Силой воли и суровым взглядом не предлагать, так только у тебя получается))


 
Игорь Шевченко ©   (2010-01-20 14:18) [24]

картман ©   (20.01.10 14:11) [22]
test ©   (20.01.10 14:16) [23]

Я до сих пор не понял, что нужно автору. Есть хорошая ссылка:
http://ln.com.ua/~openxs/articles/smart-questions-ru.html


 
картман ©   (2010-01-20 14:26) [25]


> Игорь Шевченко ©   (20.01.10 14:18) [24]


нужно:
1. получить письма, сохранить в файлы.
2. распарсить и залить в БД
3. провести семантический анализ(соответствующая  софтина крутится на сервере)
4. дождаться завершения анализа
5. переслать данные в другую БД
6. удалить данные анализа из первой БД.

Все это делается по таймеру. Если на каком-то этапе возникнет исключение, то теряется нить выполнения. Остаются необработанные данные. Как этого избежать?


 
test ©   (2010-01-20 14:27) [26]

Игорь Шевченко ©   (20.01.10 14:18) [24]
У автора есть сервис, который работает 24/7/365. Ему нужно чтобы программа не просто вываливалась при ошибках, а пыталась их обработать и все таки выполниться. Зачем ему сбойные данные не знаю, может они тоже важны, он хочет чтобы даже для сбойных данных были предприняты попытки обработать данные. Как я понял автора.


 
Сергей М. ©   (2010-01-20 14:28) [27]


> Возврат в ту процедуру, где при предыдущем выполнении возникла
> ошибка


Нет у тебя никакого "возврата"

proc1 прервалась по исключению, в обработчике которого ты выставил соотв.флаг и вернул управление процедуре Main, которая преспокойно поехала дальше, вызывая proc2. А proc2 знать ничего не знает о том что proc1 была прервана исключением


 
картман ©   (2010-01-20 14:29) [28]


> test ©   (20.01.10 14:27) [26]

 Сбойные данные, если таковые будут, я отсеиваю - с этим проблем нет. Сейчас замечена плохая связь с базой MySQL - не знаю, почему. Ну и так, на всякий случай. Да и интересно.


 
картман ©   (2010-01-20 14:31) [29]


> Сергей М. ©   (20.01.10 14:28) [27]

конечно, извиняюсь. В общем, по ошибке надо прервать выполнение:

...
   0, 1: begin
     proc1;
     if ErrorCode <> 0 then Exit;
     proc2;
     if ErrorCode <> 0 then Exit;
     proc3;
   end;
...


 
Сергей М. ©   (2010-01-20 14:40) [30]


> по ошибке надо прервать выполнение


Ну вот это уже ближе к истине)

Только вот после успешного выполнения proc3 код ошибки неплохо было бы безусловно сбросить в ноль.


 
Игорь Шевченко ©   (2010-01-20 14:43) [31]

картман ©   (20.01.10 14:26) [25]

конечный автомат.
заводишь текущее состояние, хоть в виде перечислимого типа
нифига_не_сделано,письма_получены, письма_распарсены_и_сохранены, семантический_анализ_проведен, ...

каждая из частей 1..6 выполняется только при определенном состоянии и в конце успешного выполнения ставит нужное состояние для следующего этапа, то есть, получить письма выполняется при "нифига не сделано", а в конце ставит "письма_получены". Соответсвтенно, этап "удалить данные из первой БД" выполняется при состоянии "данные_пересланы" и при успешном выполнении устанавливает состояние в "нифига_не_сделано".

Если произошла ошибка, то она, во-первых, протоколируется, во-вторых, состояние не меняется.

Переменная текущего состояния глобальна по отношению к процедуре, вызываемой по таймеру.


 
картман ©   (2010-01-20 14:43) [32]


> Сергей М. ©   (20.01.10 14:40) [30]


>
> Только вот после успешного выполнения proc3 код ошибки неплохо
> было бы безусловно сбросить в ноль.

само-собой


 
картман ©   (2010-01-20 14:44) [33]


> Игорь Шевченко ©   (20.01.10 14:43) [31]

Шикарно. Спасибо.


 
Кто б сомневался ©   (2010-01-20 22:06) [34]


> test ©   (20.01.10 13:11) [9]
>
> картман ©   (20.01.10 13:06) [8]
> while(Function_2())do Sleep(200);
>
> function function_2():boolean;
> begin
> Result := false;
> try
> ............
> Result := true;
> except
>  on e:Exception do Log.write(e.message);
> end;
> end;
>
> Только за такое надо руки отрывать.


Уважаемый вы бред несете.  почему это отрывать, да? если будет исключение, то Result всегда будет false и в лог напишем, и юзера не будем трогать..



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

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

Наверх




Память: 0.56 MB
Время: 0.067 c
15-1263542306
ocean
2010-01-15 10:58
2010.08.27
Можно ли покупать плазму?


15-1266528605
Юрий
2010-02-19 00:30
2010.08.27
С днем рождения ! 19 февраля 2010 пятница


2-1266488901
pleasure
2010-02-18 13:28
2010.08.27
каскадное копирование TSQL


15-1263833680
Pikvar
2010-01-18 19:54
2010.08.27
Delphi - с чего начинать изучение?


2-1268672321
NBAH1990
2010-03-15 19:58
2010.08.27
IP сканер