Форум: "Сети";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
ВнизTClientSocket+ClientSocket.Open=Непростой вопрос Найти похожие ветки
← →
hacker (2002-01-04 07:26) [0]Проблема такая: При Open как и полагается возникает исключение, а не OnError, НО метод, описанный в статье "Программирование сокетов в Дельфи" : Кариха Николая с заключением Open в Try Except не работает, т.к. у меня после открытия возникает первым делом событие OnDisconnect и после него исключение. Так как ловить это исключение?
← →
hacker (2002-01-04 10:02) [1]И все же кто знает?
← →
panov (2002-01-04 11:02) [2]Приводи код.
← →
hacker (2002-01-04 11:24) [3]Не знаю какое место ты спрашиваешь, это метод моего коннекта(просто в его потомок добавил), хотя такое было и при простом TClientSocket
Ситуация такая: Dial-Up вырублен, по идее это описанная ситуация.
После этого Open"a в часть Except не заходит,а продолжается выполнение как обычно и первым делом возникает Ondisconnect, после исключение ESocketError - "Windows Socket error: этот хост не известен (11001), on API" ASync Lookup"
а если коннект есть то идет как надо - OnConnect
procedure TMyClientSocket.MyConnect(URL: String);
Var sHost, sName: String;
begin
Div_URL(URL, sHost, sName);
Host:=sHost;
HeaderBuf.Add(CurrMethod+" "+sName+" HTTP/1.1");
HeaderBuf.Add("Host: "+sHost);
HeaderBuf.Add("Accept: */*");
HeaderBuf.Add("Referer: http://"+sHost);
// HeaderBuf.Add("Proxy-Connection: Keep-Alive");
If CurrMethod="GET"
then
begin
HeaderBuf.Add("Range: bytes="+IntToStr(BodyRange)+"-");
end;
HeaderBuf.Add("Pragma: no-cache");
HeaderBuf.Add("Cache-Control: no-cache");
HeaderBuf.Add("Connection: close");
HeaderBuf.Add("");
Try
Open;
Except
Здесь чего-нибудь
end;
← →
hacker (2002-01-04 13:13) [4]Код привел,а реплики не слышу..
← →
Hacker (2002-01-04 20:08) [5]Кто-нибудь, помогите
← →
Hacker (2002-01-05 14:33) [6]М.. Чего все молчат..
← →
panov (2002-01-06 23:27) [7]Ошибку тебе все-таки придется обрабатывать в OnError.
Если тебе нужно заново пытаться открыть сокет,
то в OnError пишешь:
ErrorCode := 0; //или обрабатываешь ошибку
ClientSocket.Open;
← →
Hacker (2002-01-07 20:56) [8]Как никто понять не может, что этот самый OnError не возникает вообще - читайте с начала вопроса
← →
panov (2002-01-07 21:21) [9]Уже говорили обэтом.
Отключи свойство Break On Exception в Delphi.
В OnError ErrorCode := 0;
Exception не возникнет.
← →
Hacker (2002-01-10 10:35) [10]К сожалению,я не нашел свойство Break On Exception(забыл совсем), но зато я нашел в чем глюк - это TCustomWinSocket виноват - не может нормально сам обработать сообщение о LookUp"e(в прочем моих знаний не хватило чтобы ее понять - как это вместо then вызывается Disconnect - ???)
Решение тривиальное - делать в Delphi 6 - там ошибку исправили.
← →
vlad__ (2002-01-10 21:05) [11]Async lookup будет выпадать в любом случае - хоть в ОнЕррор Еррор:=0 хоть в try except. Так уж это у борланда сделано, они не пытаются даже вызывать OnError. А отловить можно через Application.OnException.
← →
panov (2002-01-11 07:23) [12]>vlad__ (10.01.02 21:05)
А ты попробуй.
У меня не выпадает Exception.
← →
ThaDrot (2002-01-11 14:32) [13]У меня та же проблема с сокетами...
Но в onError при исключении я попадаю. Вопрос :
как сделать так, что-бы после того как я обработал ошибку
в onError среда Delphi не выдавала ошибку ?
← →
Vlad____ (2002-01-12 01:48) [14]>panov ©
А вот именно и пробовал, пока не посмотрел исходники сокета. Хотя возможно, что в каком-то из сервиспаков это и пофиксено ( У меня делфи 5 без апдейтов ) а вот и причина ( ScktComp.pas )
procedure TCustomWinSocket.CMLookupComplete(var Message: TCMLookupComplete);
begin
if Message.LookupHandle = FLookupHandle then
begin
FLookupHandle := 0;
if Message.AsyncError <> 0 then
begin
Disconnect(FSocket); // в случае ошибки сразу вываливается соответствующее сообщение а так-как это реакция на мессадж то try except не помогают
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(Message.AsyncError), Message.ASyncError, "ASync Lookup"]);
end;
//---- сдесь код для все ок ---------
end;
← →
Hacker (2002-01-12 05:58) [15]Я переконапатил другом метод ResultCheckSicket(точно не помню, но там же в начале юнита). В Делфи 6 . И убрал там Raise. Они обработчик, который там проверяется не присваивают вроде.
И все хорошо, пока
← →
Wizard_Ex (2002-01-12 13:30) [16]А если не конопатить юнит, то можно так
Кинь компонент Application Event и в событии OnExepction
напиши типа
if E is ESocketError then ничего не делать
Должно помочь
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c