6 / 6 / 1 Регистрация: 18.06.2010 Сообщений: 93 |
|
1 |
|
03.03.2011, 21:17. Показов 2514. Ответов 4
Здравствуйте! Необходимо обработать вот такую ошибку Delphi: Чтоб при появлении такой ошибки не открывалось это окно и программа не закрывалась, а, допустим, открывался showmessage с ошибкой и текстом или еще что-нибудь. Как можно обработать такого рода ошибки? Добавлено через 7 минут
0 |
2184 / 1254 / 143 Регистрация: 28.04.2010 Сообщений: 4,592 |
|
03.03.2011, 23:19 |
2 |
а что try except не подходит?
0 |
6 / 6 / 1 Регистрация: 18.06.2010 Сообщений: 93 |
|
04.03.2011, 13:36 [ТС] |
3 |
anonimus, нет, try except это все ошибки. Мне надо чтобы при ошибке «bad filename» файл переименовывался. Только вот как узнать что это именно эта ошибка, я не знаю.
0 |
6 / 6 / 1 Регистрация: 18.06.2010 Сообщений: 93 |
|
05.03.2011, 17:24 [ТС] |
4 |
вверх
0 |
anonimus 2184 / 1254 / 143 Регистрация: 28.04.2010 Сообщений: 4,592 |
||||
05.03.2011, 23:28 |
5 |
|||
ну так в try except можно же использовать
E это указатель на объект исключения
1 |
Простой пример, основанный на книге “Глубины Инди”
Собственно сам код…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
function IsFTPServerConnectionOk: Boolean; begin Result:=false; with idFTP do begin Host:=FTPParams.Host;// ‘localhost’; //FTP-сервер Port:=FTPParams.Port;// 22; //порт ФТП сервера Username:=FTPParams.Username;// ‘Логин’; Password:=FTPParams.Password;// ‘Пароль’; end; try idFTP.Connect; try try if IdFTP.Connected then Result:=true; finally idFTP.Disconnect; end; except //Other exceptions on E: EIdException do begin showmessage(E.ClassName+‘ An network error occurred during communication: ‘ +#13#10+#13#10+E.Message); end; on E: Exception do begin showmessage(E.ClassName+‘ An unknown error occurred during communication: ‘ +#13#10+#13#10+E.Message); end; end; except // Catching Connection Exceptions on E: EIdException do begin showmessage(E.ClassName+‘ An network error occurred while trying to connect: ‘ +#13#10+#13#10+E.Message); end; on E: Exception do begin showmessage(E.ClassName+‘An unknown error occurred while trying to connect: ‘ +#13#10+#13#10+E.Message); end; end; end; |
Здесь просто возбуждаются исключения. В принципе их можно где-то хранить и как-то обрабатывать. Отделены ошибки соединения от всех остальных ошибок. Но в данном, случае, конечно это перебор, так как единственное, что мы делаем – это только соединяемся с FTP сервером.
Способ №2
Также другой способ – нашел на форуме, просто иллюстрация идеи
http://delphimaster.net/view/6-94986
var B: array [1..3] of Char; begin Timer.Enabled:=false; <<<<<< if FTP.Connected then try FTP.ReadBuffer(b, 1); except meLog.Lines.Add(«НЕТ СОЕДИНЕНИЯ»); end; Timer.Enabled:=true; <<<<<< end |
This entry was posted in Delphi, Indy. Bookmark the permalink.
← →
MegaVolt ©
(2006-02-17 14:37)
[0]
При возникновении некого исключения TIdFTP возвращает мне некую строчку с ошибкой. Например «Login or password incorect!». Можно ли её считать постоянной и независящей от языка винды? Или нельзя?
Короче как распознать что именно за исключение возникло. Например при неправильном пароле нужно запросить у польователя правильный. А при ошибке соединения выдать развёрнутое сообщение с описание где возникла ошибка.
← →
Dmitrij_K
(2006-02-17 14:49)
[1]
Смотри EIdProtocolReplyError.ReplyErrorCode
← →
MegaVolt ©
(2006-02-17 15:01)
[2]
>Смотри EIdProtocolReplyError.ReplyErrorCode
посмотрел но это похоже к FTP не имеет отношения
К сокетам вот это подходит EIdSocketError.LastError
А вот ошибки FTP типа Time Out или Password incorrect имеют другой тип и кода вроде как не имеют
← →
umbra ©
(2006-02-17 15:03)
[3]
> некого исключения
какого именно?
← →
MegaVolt ©
(2006-02-17 15:08)
[4]
>какого именно?
например я коннекчусь к серверу.
Вызываю IdFTP1.Connect;
Если сервер молчит получаю исключение с сообщением таймаут
Если серверу не подходит мой пароль то выдаёт сообщение пароль некоректный.
Если мой файервол непустил прожку в сеть то получаю ошибку подключение разорвано.
Т.е. я получаю строку которая содержит ошибку на английском. Где гарантия что на другой винде эта строка будет бит в бит такой же? Если гарантии нет то я не могу опиратся на это сообщения для анализа причины ошибки в программе.
← →
Dmitrij_K
(2006-02-17 15:21)
[5]
try
ftp.Connect;
except
ShowMessage(IntToStr(EIdProtocolReplyError(ExceptObject).ReplyErrorCode))
end
Коды ошибок см в описании FTP протокола или эксперементально
← →
umbra ©
(2006-02-17 15:24)
[6]
Dmitrij_K в [1] дал Вам в общем, правильный совет. Эти ошибки — не ошибки в программе, а ошибки, которые выдает протокол взаимодействия (у Вас — ФТП). У каждой такой ошибки есть уникальный трехзначный код. Перечень этих кодов и что они значат можно найти в описании протокола (для ФТП это RFC 959). В программе Вам надо ловить исключение EIdProtocolReplyError
, в свойстве ReplyErrorCode
которого и будет код ошибки. Далее, на основе этого кода Вы выдаете пользователю свое сообщение. Ориентироваться на текст сообщения об ошибке не стоит.
← →
MegaVolt ©
(2006-02-17 15:28)
[7]
Заработало :))))
Только вот один вопрос а если вдруг исключение отличается от EIdProtocolReplyError или IdFTP возвращает только такие исключения?
Т.е. не возникнет ли у меня ситуация когда я буду обращатся к ReplyErrorCode хотя его в природе не существует?
← →
Dmitrij_K
(2006-02-17 15:35)
[8]
Проверь сначала что исключение EIdProtocolReplyError
if (ExceptObject is EIdProtocolReplyError)
← →
MegaVolt ©
(2006-02-17 15:41)
[9]
А как быть с таймаутом? Он не подходит не под EIdProtocolReplyError не под EIdSocketError
← →
umbra ©
(2006-02-17 15:42)
[10]
> IdFTP возвращает только такие исключения
нет конечно. Могут возникнуть любые исключения.
Поэтому луше писать так
try
ftp.Connect;
except
on E: EIdProtocolReplyError do ShowMessage(IntToStr(E.ReplyErrorCode));
on E: EAnotherError do {что нибудь}; //какое-то абстрактное другое исключение
end;
← →
umbra ©
(2006-02-17 15:46)
[11]
> А как быть с таймаутом?
это EIdConnectTimeout
← →
MegaVolt ©
(2006-02-17 15:54)
[12]
> EIdConnectTimeout
Уря-я-я точно именно оно.
А я уже начал писать так :
on e: EIdException do
begin
if e.Message=RSConnectTimeout then ShowMessage("Id>Время вышло");
end;
Научите как вы так быстро это находите?
← →
umbra ©
(2006-02-17 16:05)
[13]
рецепт для инди:
берутся три буквы EId и справа к ним добавляется название искомой ситуации по английски. Затем в справке проверяем, угадали или нет
← →
Dmitrij_K
(2006-02-17 16:09)
[14]
Или так except
ShowMessage(ExceptObject.ClassName)
end
← →
MegaVolt ©
(2006-02-17 16:21)
[15]
Ясно. Огромное спасибо
Форум программистов Vingrad
Модераторы: Snowy, Poseidon, MetalFan |
Поиск: |
|
Перехват ошибок от idFTP |
Опции темы |
Andreyzpr |
|
||
Бывалый Профиль
Репутация: нет
|
если при работе idFTP возникает какая нибудь проблема (например, нет привелегий для закачки или не прошол авторизацию) винда выдает ошибку! А как эти ошибки можно перехватить? Тоесть чтобы винда ошибку не выкинула, и в тоже время я мог заменить своим окном! |
||
|
|||
z-END |
|
||
прафесар™ Профиль
Репутация: 1
|
читаем про try except ——————— Каждый чилавек пасвоему праф…а памоему НЕТ! |
||
|
|||
_hunter |
|
||
Эксперт Профиль
Репутация: 5
|
винда (что бы это нибыло) никаких ошибок не выкидывает: их твоя программа выкидывает.
что такое кода ошибки я не знаю, но если это относится к компоненту — оно есть в его справке… ——————— Tempora mutantur, et nos mutamur in illis… |
||
|
|||
Andreyzpr |
|
||
Бывалый Профиль
Репутация: нет
|
z-END где читаем? _hunter что есть try/catch???????????????? |
||
|
|||
Snowy |
|
||
Эксперт Профиль
Репутация: 53
|
Да где угодно. |
||
|
|||
Rohoss |
|
||
Начальник интернета Профиль
Репутация: нет
|
И пропиши в Uses IdException ——————— Файловый менеджер Explorer.Net скачать video |
||
|
|||
|
Правила форума «Delphi: Сети» | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
Can anyone explain to me how to handle errors with TIdFTP
?
For example, I try to connect as follows …
with IdFTP do
begin
Username := xxxxx;
Password := '1000';
Host := xxx.xxx.xxx.xxx;
Port := 21;
ConnectTimeOut := 5000;
try
Connect;
except
On E: Exception do
ShowMessage(E.Message);
end;
end;
If I use the wrong password (as I have deliberately done in the above example to simulate what might happen if a user provides the wrong password), I get the error «Bad sequence of commands». That tells me nothing about the real problem. Is there any way to get a meaningful description of the actual error, ie: that the password is incorrect?