![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Exception
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,
> что кстати это решает?
И причем здесь это к обработке исключений?