Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Exception


Страницы:   1 2

markers ©   (2005-11-17 21:10:00) 

Здраствуйте!!!
Где можно перехватить сообщения ESocketError. И выдернуть сообщение которое он хотел сказать. Заранее спасибо!


Digitman   (2005-11-18 15:04:00) [1]


> если сильно критическая ошибка закрывать сокет, а если не
> то дальше работать например, так?


ну такие ошибки, как правило, критические ..

например, ошибка недоступности хоста (при попытке коннекта) или неожиданного "прерывания связи" с ним (при уже установленном ранее с ним коннекте)


markers   (2005-11-18 14:46:00) [2]

Всё спасибо большое, теперь понял..... В том плане если сильно критическая ошибка закрывать сокет, а если не то дальше работать например, так?


Digitman   (2005-11-18 14:16:00) [3]


> В ErrorCode содержиться цифра ошибки


не "цифра", а число. Разницу понимаешь ?


> то мне ещё нужно?


тебе нужно проанализировать код ошибки и по результатам этого анализа уже предпринимать дальнейшие алгоритмические действия, которые НАПРЯМУЮ зависят от того, ЧТО на самом деле явилось причиной отказа.


> что можно поделать, когда хост не найден, а потом подключаешься
> когда он уже есть, всё-равно даёт ошибку


procedure TForm1.ClientSocket1Error(..);
begin
 ErrorCode := 0;
 Socket.Close; //!!
..
end;


markers   (2005-11-18 13:58:00) [4]

В ErrorCode содержиться цифра ошибки, по которой я и получаю сообщение из винды, а что мне ещё нужно? Мне просто нужно показать собственную мессагу с сообщением об ошике, и произвести пару манипуляций...... Я конечно по начулу прописывал на ErrorEvent, собственные мессаги, но мне это показалось не особо идеальным...... Кстати, что можно поделать, когда хост не найден, а потом подключаешься когда он уже есть, всё-равно даёт ошибку (После Error`а я делаю ClientSocket.Active:=False)....


Digitman   (2005-11-18 11:40:00) [5]


> markers


на SysErrorMessage() в случае Winsock надеяться не следует, да и подробностей в таких сообщениях нет

что толку от сообщения типа "Async operation failed" ?

и без него понятно, что отказ вызвал именно асинхронный вызов такой-то ф-ции ..

а вот ErrorCode как раз и дает детальную инф-цию о причинах отказа


markers   (2005-11-18 11:15:00) [6]

Кусок кода
     else raise ESocketError.CreateResFmt(@sWindowsSocketError{Эта строчка в consts.pas прописана},
       [SysErrorMessage(Result){Сообшение об ошибки из винды}, Result, Op]);


markers   (2005-11-18 11:13:00) [7]

Не часть генерит компонент а остальное берётся из винды, я исходники сокетов посмотрел


markers   (2005-11-18 11:12:00) [8]

SysErrorMessage :) Уже сделал! Ещё раз спасибо!


Digitman   (2005-11-18 11:12:00) [9]

А зачем они тебе ?
Дл анализа и принятия решений достаточно иметь ErrorCode

К тому же те сообщения, которые ты видишь при ошибках в TClientSocket, генерирует восве не "винда", а сам компонент


markers   (2005-11-18 11:09:00) [10]

А где можно взять стандартные сообщения об ошибках? (Которые винда генерит)


markers   (2005-11-18 10:17:00) [11]

Всё разобрался! Спасибо!:)


markers   (2005-11-18 10:14:00) [12]

Ну я сделал так
try
raise ESocketError.Create('SocketError');
Sayed:=False;
ServerConnected:=False;
ServerConnectedFull:=False;
ClientSocket.Socket.SendText('BYE');
ClientSocket.Active:=False;
LogingAction('Произошла ошибка в работе программы в сети ошибка номер: '+IntToStr(ErrorCode)+' Сообщение об ошибке: ',High,Inf_Error);
except
on ESocketError: Exception do Information('КРИТИЧЕСКАЯ ОШИБКА!!!'+#13#10+ESocketError.Message,Inf_Error,5);
end;
Он ловит её, но всё-равно потом идёт стандартная ошибка.


Digitman   (2005-11-18 10:10:00) [13]


> у Socket есть событие Error, но там его невозможно перекрыть


термин "перекрыть" применим только к виртуальным методы класса-предка.
исключения тоже не "перекрывают", а перехватываюти обрабатывают.

событие не является методом, событие это событие - с т.з. класса, потенциально способного возбуждать его, событие есть св-во типа TMethod.

что же касается конкретно события TClientSocket.OnError, то в справке к нему черным по белому написано :

Occurs when the socket fails in making, using, or shutting down a connection.
..

Description

Write an OnError event handler to respond to errors that arise with the socket connection. Set the ErrorCode parameter to 0 if the OnError event handler successfully deals with the error condition, to prevent an ESocketError from being raised.


markers   (2005-11-18 10:03:00) [14]

А если я в этом обработчике Raise подниму, поможет?


markers   (2005-11-18 09:58:00) [15]

EurekaLog просто перекрывает стандартный оброботчик событь и всё, своего он ничего не добавляет...


markers   (2005-11-18 09:58:00) [16]

Да у Socket есть событие Error, но там его невозможно перекрыть, что мне необходимо! И как мне поступить?


sniknik   (2005-11-18 08:41:00) [17]

> Может просто глюк был....
не глюк. асинхронность это такая штука, когда ты по open/activate только даеш компоненту команду на выполнение... команду он принял, ок, выполнение в твоем коде пошло дальше, а компонент в тоже время в отдельном потоке пытается выполнить полученную команду на открытие. (уже вне твоего блока, да и потока тоже)
поставив несинхронное выполнение ты стал ждать результата выполнения действия по команде, а не только самой команды. поэтому и дожидаешся ошибок.
несинхронные надо ловить в событиях компонента/подключения. (незнаю как в твоем EurekaLog-е, но вот к примеру в ADODataset на onFetchComplete передается параметром и Error: Error; т.е. если асинхронное получение данных завершится ошибкой то она там и будет, на завершении команды в передаваемом Error)


Digitman   (2005-11-18 08:20:00) [18]


> markers ©   (17.11.05 22:44) [14]
> Этот режим на что влияет?


на синхронность выполнения транспортных алгоритмов компонента


markers   (2005-11-17 23:16:00) [19]

Обсалютно не знаю, но сие реально помогло..... Сообщения стали ловиться (Ничего кроме этого не менял) Может просто глюк был....


Джо   (2005-11-17 22:48:00) [20]


>  [13] markers ©   (17.11.05 22:43)
> Всё проблема решена, она была в ClientType:=ctNotBlocking,
> что кстати это решает?

И причем здесь это к обработке исключений?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо