Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
картман ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.082 c
6-1216978382
Zhekson
2008-07-25 13:33
2010.08.27
Отправка письма


8-1204196768
Nikki
2008-02-28 14:06
2010.08.27
Как вывести картинку из буфера в DirectDraw?


15-1275383564
boriskb
2010-06-01 13:12
2010.08.27
Образование в СССР


2-1267688655
evg
2010-03-04 10:44
2010.08.27
Какой компонент использовать для отображения сектора


15-1272975151
NailMan
2010-05-04 16:12
2010.08.27
К летнему сезону киберматрицы готов!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский