![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обработать исключения которые генерит TIdFTP? [D5, Win95/98]
MegaVolt © (2006-02-17 14:37:00)При возникновении некого исключения TIdFTP возвращает мне некую строчку с ошибкой. Например "Login or password incorect!". Можно ли её считать постоянной и независящей от языка винды? Или нельзя?
Короче как распознать что именно за исключение возникло. Например при неправильном пароле нужно запросить у польователя правильный. А при ошибке соединения выдать развёрнутое сообщение с описание где возникла ошибка.
MegaVolt (2006-02-17 16:21:00) [1]Ясно. Огромное спасибо :)
Dmitrij_K (2006-02-17 16:09:00) [2]Или так
except
ShowMessage(ExceptObject.ClassName)
end
umbra (2006-02-17 16:05:00) [3]рецепт для инди:
берутся три буквы EId и справа к ним добавляется название искомой ситуации по английски. :) Затем в справке проверяем, угадали или нет
MegaVolt (2006-02-17 15:54:00) [4]> EIdConnectTimeout
Уря-я-я точно именно оно.
А я уже начал писать так :
on e: EIdException do
begin
if e.Message=RSConnectTimeout then ShowMessage('Id>Время вышло');
end;
Научите как вы так быстро это находите?
umbra (2006-02-17 15:46:00) [5]
> А как быть с таймаутом?
этоEIdConnectTimeout
umbra (2006-02-17 15:42:00) [6]
> IdFTP возвращает только такие исключения
нет конечно. Могут возникнуть любые исключения.
Поэтому луше писать так
try
ftp.Connect;
except
on E: EIdProtocolReplyError do ShowMessage(IntToStr(E.ReplyErrorCode));
on E: EAnotherError do {что нибудь}; //какое-то абстрактное другое исключение
end;
MegaVolt (2006-02-17 15:41:00) [7]А как быть с таймаутом? Он не подходит не под EIdProtocolReplyError не под EIdSocketError
Dmitrij_K (2006-02-17 15:35:00) [8]Проверь сначала что исключение EIdProtocolReplyError
if (ExceptObject is EIdProtocolReplyError)
MegaVolt (2006-02-17 15:28:00) [9]Заработало :))))
Только вот один вопрос а если вдруг исключение отличается от EIdProtocolReplyError или IdFTP возвращает только такие исключения?
Т.е. не возникнет ли у меня ситуация когда я буду обращатся к ReplyErrorCode хотя его в природе не существует?
umbra (2006-02-17 15:24:00) [10]Dmitrij_K в [1] дал Вам в общем, правильный совет. Эти ошибки - не ошибки в программе, а ошибки, которые выдает протокол взаимодействия (у Вас - ФТП). У каждой такой ошибки есть уникальный трехзначный код. Перечень этих кодов и что они значат можно найти в описании протокола (для ФТП это RFC 959). В программе Вам надо ловить исключение
EIdProtocolReplyError, в свойствеReplyErrorCodeкоторого и будет код ошибки. Далее, на основе этого кода Вы выдаете пользователю свое сообщение. Ориентироваться на текст сообщения об ошибке не стоит.
Dmitrij_K (2006-02-17 15:21:00) [11]try
ftp.Connect;
except
ShowMessage(IntToStr(EIdProtocolReplyError(ExceptObject).ReplyErrorCode))
end
Коды ошибок см в описании FTP протокола или эксперементально
MegaVolt (2006-02-17 15:08:00) [12]>какого именно?
например я коннекчусь к серверу.
Вызываю IdFTP1.Connect;
Если сервер молчит получаю исключение с сообщением таймаут
Если серверу не подходит мой пароль то выдаёт сообщение пароль некоректный.
Если мой файервол непустил прожку в сеть то получаю ошибку подключение разорвано.
Т.е. я получаю строку которая содержит ошибку на английском. Где гарантия что на другой винде эта строка будет бит в бит такой же? Если гарантии нет то я не могу опиратся на это сообщения для анализа причины ошибки в программе.
umbra (2006-02-17 15:03:00) [13]
> некого исключения
какого именно?
MegaVolt (2006-02-17 15:01:00) [14]>Смотри EIdProtocolReplyError.ReplyErrorCode
посмотрел но это похоже к FTP не имеет отношения :(
К сокетам вот это подходит EIdSocketError.LastError
А вот ошибки FTP типа Time Out или Password incorrect имеют другой тип и кода вроде как не имеют :(
Dmitrij_K (2006-02-17 14:49:00) [15]Смотри
EIdProtocolReplyError.ReplyErrorCode