Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
Лёша   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.014 c
1-82305
Pomashok
2003-09-13 21:34
2003.09.25
Как прально описвать функцию?


3-82096
Avsam
2003-09-04 16:09
2003.09.25
Оracle 9i. Список онлайн-подключений.


1-82300
AndyGee
2003-09-14 14:55
2003.09.25
CreateProcess и перенаправление стандартного ввода-вывода


7-82517
Номолос
2003-07-14 08:31
2003.09.25
Как переделать имя файла из под Windows в DOS овское?


1-82320
Grouzd[E]v
2003-09-13 09:19
2003.09.25
Будете смеятся: работать с архивами я теперь умею (ho-ho-ho)!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский