Главная страница
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.039 c
14-82481
AndreySoft
2003-08-28 12:59
2003.09.25
Как включить комп программно


1-82270
Zhouck
2003-09-11 13:04
2003.09.25
Delphi+OpenOffice.org


3-82134
Rootal
2003-09-04 13:18
2003.09.25
Создание отчета


6-82377
Flying Home
2003-07-29 14:15
2003.09.25
Серврное приложение


3-82070
Denkop
2003-09-03 15:08
2003.09.25
Двойные кавычки в запросе