Форум: "Прочее";
Текущий архив: 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.061 c