Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка Win при обработке исключения.

373
25 мая 2006 года
unmoved
216 / / 28.11.2004
Есть такой код:
try
get_from_ftp;
except
on EIdReplyRFCError do begin sendmsg('test'); get_from_ftp; end;
end;

Процедура get_from_ftp скачаивает файлы с ftp, если указать несуществующий ftp, то произойдет исключение. В среде Delphi он не выполняется бесконечно, а завершается после 2-го раза, а если просто так запустить, то после первого раза(попытки подключения) выдается ошибка Win о том что приложение выполнило недопустиму функцию. Почему так происходит и как сделать так что б при возникновении исключения процесс продолжался вновь и вновь(запуска процедуры)? И как получить само собщение, я в 2005 и E.Message не пашет...
286
25 мая 2006 года
misha_turist
572 / / 28.11.2005
Цитата:
Originally posted by unmoved
Есть такой код:
try
get_from_ftp;
except
on EIdReplyRFCError do begin sendmsg('test'); get_from_ftp; end;
end;



Ну во первых, я так понимаю, что EIdReplyRFCError - это ошибка на несуществующий FTP. если так, то

Код:
//объявляем метку
label a;
begin
//.................
try
//выполняем процедуру
a: get_from_ftp;
except
//если ошибка
on EIdReplyRFCError do
begin
//выводим сообщение
 sendmsg('test');
//переходим к вызову процедуры
 goto a;
end;
end;
//...................
end;

А теперь твой вариант
Код:
try
//первый вызов процедуры
get_from_ftp;
except
//если ошибка
on EIdReplyRFCError do
begin
//выводим сообщение
 sendmsg('test');
{второй вызов процедуры, но сдесь то try except нету и при ошибке тякущая (не get_from_ftp) процедура вылетает}
 get_from_ftp;
end;
end;


Но есть такой момент, что я это без Delphi писал и с FTP не работал, так что написаное проверяй, но вроде должно работать. НО УЧТИ ЭТОТ ВАРИАНТ ПРОГУ ПОВЕСИТ, ПОКА ФАЙЛ НЕ СКАЧАЕТ, ТАК ЧТО ПРЕДУСМОТРИ ВАРИАНТЫ ВЫХОДА (к примеру запрос на каждую новую попытку скачивания). А ещё на всётаки я применительно к Delphi 7 рассуждаю...:)

А почему E.Message не работает, не знаю.... у меня в 7 всё всегда срабатывало.... проверь ты правильно записал, должно быть (если конечно sendmsg - это вывод сообщения, потомучто я его не нашел)
 
Код:
on E:EIdReplyRFCError do sendmsg(E.Message);
373
26 мая 2006 года
unmoved
216 / / 28.11.2004
Ну goto меня смущает, я почти тоже самое через цикл сделал.
286
26 мая 2006 года
misha_turist
572 / / 28.11.2005
Цитата:
Originally posted by unmoved
Ну goto меня смущает, я почти тоже самое через цикл сделал.


А как текст покажи пожалуста?

373
29 мая 2006 года
unmoved
216 / / 28.11.2004
Цитата:
Originally posted by misha_turist
А как текст покажи пожалуста?



repeat
try
put_to_hrs;
except
on E: EIdReplyRFCError do begin sendmsg(datetimetostr(now) + ': ' + 'Cant login to ' + ftp.Host + '. ' + E.Message); err:=1; end;
on E: EIdSocketError do begin sendmsg(datetimetostr(now) + ': ' + 'Cant connect to ' + ftp.Host + '. ' + E.Message); err:=1; end;
on E: EIdConnClosedGracefully do begin sendmsg(datetimetostr(now) + ': ' + 'Cant connect to ' + ftp.Host + '. ' + E.Message); err:=1; end;
else begin get_from_hrs; sendmsg(datetimetostr(now) + ': ' + 'Unknown error!'); err:=1; end;
end;
until err<>1

286
29 мая 2006 года
misha_turist
572 / / 28.11.2005
Цитата:
Originally posted by unmoved
repeat
try
put_to_hrs;
except
on E: EIdReplyRFCError do begin sendmsg(datetimetostr(now) + ': ' + 'Cant login to ' + ftp.Host + '. ' + E.Message); err:=1; end;
on E: EIdSocketError do begin sendmsg(datetimetostr(now) + ': ' + 'Cant connect to ' + ftp.Host + '. ' + E.Message); err:=1; end;
on E: EIdConnClosedGracefully do begin sendmsg(datetimetostr(now) + ': ' + 'Cant connect to ' + ftp.Host + '. ' + E.Message); err:=1; end;
else begin get_from_hrs; sendmsg(datetimetostr(now) + ': ' + 'Unknown error!'); err:=1; end;
end;
until err<>1



Ну и что...

Обрати внимание у меня

Код:
try
//Процедура выполняется только сдесь (между try и except)!!!!!!!! и ошибки всегда отслеживаются.
a: get_from_ftp;
except
//если ошибка
on EIdReplyRFCError do
begin
//выводим сообщение
 sendmsg('test');
//переходим к вызову процедуры
 goto a;
end;
end;


У тебя
Код:
repeat
try
//Сдесь всё хорошо и правильно, ошибки мы отслеживаем, но....
put_to_hrs;
except
on E: EIdReplyRFCError do begin sendmsg(datetimetostr(now) + ': ' + 'Cant login to ' + ftp.Host + '. ' + E.Message); err:=1; end;
on E: EIdSocketError do begin sendmsg(datetimetostr(now) + ': ' + 'Cant connect to ' + ftp.Host + '. ' + E.Message); err:=1; end;
on E: EIdConnClosedGracefully do begin sendmsg(datetimetostr(now) + ': ' + 'Cant connect to ' + ftp.Host + '. ' + E.Message); err:=1; end;
else begin
//Но сдесь то уже раздел (except - end) и отслеживания ошибок сдесь не происходит... соответственно при ней (ошибке) процедура и вылитает.....
get_from_hrs;
sendmsg(datetimetostr(now) + ': ' + 'Unknown error!'); err:=1; end;
end;
until err<>1


А то, что у тебя там цикл ни какого влияния не оказываерт.....

Впринципе конечно ты прав цикл было бы правильнее, но я не знаю можно ли try except end и циклы перекрещивать.

А на счёт E.Message незнаю... попробуй с другими ошибками, возможно просто эти конкретные текст в Message не заносят.....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог