![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
МУЖИКИ, подскажите как корректно обрабатывать ексепшены
Лёша © (2003-07-28 14:15:00)
возникающие при неудачном подключении к серверу. Использую TClientSocket. Когда сервер не в сети, а я пытаюсь подцепиться ему в порт после вылазит ексепшен (ESocketError "Asinchronous socket error 10060").
Так вот, как его обработать так, чтобы не вылазила месага?
Заранее благодарю.
Polevi (2003-07-29 15:32:00) [1]
я такой капризный :) LOL
Digitman (2003-07-29 15:30:00) [2]
> Polevi
долго ж тебя "убалтывать" пришлось)
Polevi (2003-07-29 15:16:00) [3]
ладно , уболтали, нужен 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;
Verg (2003-07-29 13:50:00) [4]
> Polevi ©
Если интересно, проведи эксперимент:
Win98
Никаких сетевых карт - только дииалап.
Установи модемное соединение с инетом
Запусти свою программу, в которой по кнопке ClientSocket1.Activ:=true
При этом если соединение не происходит, то появляются OnError (все как бы грамотно)
Теперь установи соединение с любым хостом, так, теперь разединись и не выходя из своей программы разорви диалап соединение. Дальнейшие попытки соединится с тем хостом, с которым соединялся при живом диалапе будут приводить не к OnError а к исключениям при .Activ:=true
Поэтолу, в общем случае try except end;
Digitman (2003-07-29 13:44:00) [5]
> Polevi
ну и коннект в том числе !)... считаешь, кроме как по отказу коннекта из-за недоступности хоста/порта иных причин нет для возбуждения синхр.исключения в ходе процедуры коннекта ? Не есть это хорошо - игнорировать оные)
а речь как раз шла о
> чтоже мне теперь вызов любой ф-ии в try-except заключать
> что ли
любая ф-ция - это в т.ч. и ф-ция отправки/приема сообщения
Polevi (2003-07-29 12:36:00) [6]
>В момент твоей KeepAlive-посылки
речь шла о connect а не send
Digitman (2003-07-29 11:13:00) [7]
> Polevi
ну почему же сразу "любой" ?) масса же синхронных отказов может иметь место в принципе ! Самые критичные к этому точки алгоритма и следует, наверно, в "скобки" заключать ...
а если, к примеру, Winsock-ядро отказало ? мало ли насколько ресурсоемко приложение в целом ! или - мало ли что может произойти с вирт.петлей соединения, когда send/recv уже вызваны, но - до возврата wsaewouldblock ! в ряде случаев обнаружение штатного/нештатного дисконнекта петли в асинхр.режиме удобней фиксировать не "ловлей" асинхр.события дисконнекта, а синхронной "ловлей" исключения ...
Пример - после коннекта удал.партнер по петле неожиданно потерял связь со своим прокси по физ.причинам. Асинхр.дисконнекта не жди - лог.разрыва еще нет, его прокси "держит" соединение в кэше несколько минут. В момент твоей KeepAlive-посылки ты вполне можешь получить (от его прокси) синхронную WSAECONNABORTED, которая как раз и д.б. обработана у тебя в except-блоке с закрытием своего гнезда.
Polevi (2003-07-29 10:32:00) [8]
2Digitman © (29.07.03 10:31)
чтоже мне теперь вызов любой ф-ии в try-except заключать что ли :)
Digitman (2003-07-29 10:31:00) [9]
> Polevi
ну может и не лишнее, положим)... ибо могут возникнуть и иные исключения, не связанные с результатами коннекта
Polevi (2003-07-29 10:31:00) [10]
2Fredericco © (29.07.03 10:30)
в асинхронном режиме это надо делать в соотв. обработчике
Fredericco (2003-07-29 10:30:00) [11]
2Polevi © (29.07.03 10:21)
Если я не ошибаюсь, то Digitman в свое время мне говорил, что если не уничтожать гнездо при ошибке коннекта 10055 то метод Open вызовет искл. ситуацию.
Polevi (2003-07-29 10:21:00) [12]
2Morfein © (28.07.03 22:47)
в асинхронном режиме это лишнее
Morfein (2003-07-28 22:47:00) [13]
А лучше в дополнение ещё и вызов процедуры ClientSocket1.Open (или ClientSocket1.Active:=true) обрамить в try-except.
Лёша (2003-07-28 14:52:00) [14]
>Digitman
Спасибо!
Digitman (2003-07-28 14:46:00) [15]
procedure TMyForm.ClientSocket1OnError(..);
begin
ErrorCode := 0;
Socket.Close;
end;