Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.25;
Скачать: CL | DM;

Вниз

МУЖИКИ, подскажите как корректно обрабатывать ексепшены   Найти похожие ветки 

 
Лёша ©   (2003-07-28 14:15) [0]

возникающие при неудачном подключении к серверу. Использую TClientSocket. Когда сервер не в сети, а я пытаюсь подцепиться ему в порт после вылазит ексепшен (ESocketError "Asinchronous socket error 10060").
Так вот, как его обработать так, чтобы не вылазила месага?
Заранее благодарю.


 
Digitman ©   (2003-07-28 14:46) [1]

procedure TMyForm.ClientSocket1OnError(..);
begin
ErrorCode := 0;
Socket.Close;
end;


 
Лёша ©   (2003-07-28 14:52) [2]

>Digitman
Спасибо!


 
Morfein ©   (2003-07-28 22:47) [3]

А лучше в дополнение ещё и вызов процедуры ClientSocket1.Open (или ClientSocket1.Active:=true) обрамить в try-except.


 
Polevi ©   (2003-07-29 10:21) [4]

2Morfein © (28.07.03 22:47)
в асинхронном режиме это лишнее


 
Fredericco ©   (2003-07-29 10:30) [5]

2Polevi © (29.07.03 10:21)
Если я не ошибаюсь, то Digitman в свое время мне говорил, что если не уничтожать гнездо при ошибке коннекта 10055 то метод Open вызовет искл. ситуацию.


 
Digitman ©   (2003-07-29 10:31) [6]


> Polevi


ну может и не лишнее, положим)... ибо могут возникнуть и иные исключения, не связанные с результатами коннекта


 
Polevi ©   (2003-07-29 10:31) [7]

2Fredericco © (29.07.03 10:30)
в асинхронном режиме это надо делать в соотв. обработчике


 
Polevi ©   (2003-07-29 10:32) [8]

2Digitman © (29.07.03 10:31)
чтоже мне теперь вызов любой ф-ии в try-except заключать что ли :)


 
Digitman ©   (2003-07-29 11:13) [9]


> Polevi

ну почему же сразу "любой" ?) масса же синхронных отказов может иметь место в принципе ! Самые критичные к этому точки алгоритма и следует, наверно, в "скобки" заключать ...

а если, к примеру, Winsock-ядро отказало ? мало ли насколько ресурсоемко приложение в целом ! или - мало ли что может произойти с вирт.петлей соединения, когда send/recv уже вызваны, но - до возврата wsaewouldblock ! в ряде случаев обнаружение штатного/нештатного дисконнекта петли в асинхр.режиме удобней фиксировать не "ловлей" асинхр.события дисконнекта, а синхронной "ловлей" исключения ...
Пример - после коннекта удал.партнер по петле неожиданно потерял связь со своим прокси по физ.причинам. Асинхр.дисконнекта не жди - лог.разрыва еще нет, его прокси "держит" соединение в кэше несколько минут. В момент твоей KeepAlive-посылки ты вполне можешь получить (от его прокси) синхронную WSAECONNABORTED, которая как раз и д.б. обработана у тебя в except-блоке с закрытием своего гнезда.


 
Polevi ©   (2003-07-29 12:36) [10]

>В момент твоей KeepAlive-посылки
речь шла о connect а не send


 
Digitman ©   (2003-07-29 13:44) [11]


> Polevi


ну и коннект в том числе !)... считаешь, кроме как по отказу коннекта из-за недоступности хоста/порта иных причин нет для возбуждения синхр.исключения в ходе процедуры коннекта ? Не есть это хорошо - игнорировать оные)

а речь как раз шла о

> чтоже мне теперь вызов любой ф-ии в try-except заключать
> что ли


любая ф-ция - это в т.ч. и ф-ция отправки/приема сообщения


 
Verg ©   (2003-07-29 13:50) [12]


> Polevi ©


Если интересно, проведи эксперимент:
Win98
Никаких сетевых карт - только дииалап.

Установи модемное соединение с инетом
Запусти свою программу, в которой по кнопке ClientSocket1.Activ:=true
При этом если соединение не происходит, то появляются OnError (все как бы грамотно)
Теперь установи соединение с любым хостом, так, теперь разединись и не выходя из своей программы разорви диалап соединение. Дальнейшие попытки соединится с тем хостом, с которым соединялся при живом диалапе будут приводить не к OnError а к исключениям при .Activ:=true

Поэтолу, в общем случае try except end;





 
Polevi ©   (2003-07-29 15:16) [13]

ладно , уболтали, нужен try, TClientSocket кучу excpetions может в методе Open срейзить.. давно его не использовал

procedure TCustomWinSocket.Open(const Name, Address, Service: string; Port: Word; Block: Boolean);
begin
if FConnected then raise ESocketError.CreateRes(@sSocketAlreadyOpen);
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
if FSocket = INVALID_SOCKET then raise ESocketError.CreateRes
...
end;


 
Digitman ©   (2003-07-29 15:30) [14]


> Polevi


долго ж тебя "убалтывать" пришлось)


 
Polevi ©   (2003-07-29 15:32) [15]

я такой капризный :) LOL



Страницы: 1 вся ветка

Текущий архив: 2003.09.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
3-82132
andy-ivt
2003-09-04 11:34
2003.09.25
Подключение к сетевой БД с помощью InterBase Express


1-82284
Vinter
2003-09-15 07:14
2003.09.25
как добавить свою надпись в строку состояния Internet Explorer a


3-82065
cancel
2003-09-02 15:51
2003.09.25
GROUP BY...


1-82194
DeScriptor
2003-09-12 15:40
2003.09.25
Глобальные проблемы в работе с файлами в Дельфи


3-82032
denis24
2003-09-02 20:12
2003.09.25
select из excel с помощью ado