Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

Exception   Найти похожие ветки 

 
markers ©   (2005-11-17 21:10) [0]

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


 
Джо ©   (2005-11-17 21:22) [1]


> Где можно перехватить сообщения ESocketError.

В обработчике except, разумеется.

> И выдернуть сообщение которое он хотел сказать. Заранее
> спасибо!


 try
   ...
 except
   on E: ESocketError do
     ShowMessage(E.Message);
 end;


 
markers ©   (2005-11-17 21:28) [2]

Да это я знаю мой вот:
  try
   ClientSocket.Host:=PChar(Adress);
   ClientSocket.Port:=StrToInt(Port);
   ClientSocket.Active:=True;
  except
   on ESocketError: Exception do MessageBox(Handle,PChar(ESocketError.Message),"ERROR",16);
  end;

Но он не обрабатываеться.... В том то и дело


 
markers ©   (2005-11-17 21:29) [3]

И когда сообщения посылаю тоже проверяю и всё-равно не ловиться.....


 
Джо ©   (2005-11-17 21:31) [4]


>  [3] markers ©   (17.11.05 21:29)
> И когда сообщения посылаю тоже проверяю и всё-равно не ловиться.....

Какое-такое "сообщение"?! Ты ведь об исключениях и их обработчиках говоришь.


 
Джо ©   (2005-11-17 21:32) [5]


> Но он не обрабатываеться....

Что значит - "не обрабатывается"? Откуда такие сведения?


 
markers ©   (2005-11-17 21:36) [6]

У меня при нажатии на кнопку происходит присвоение портов и адресов и делаеться ClientSocket.Active:=True, потом посылаеться сообщение "Hello" и так далее, дак вот я прописывал трайэксцепт и там и там, и всё-равно срабатывало только "стандарный" обработчик исключений.... Вот по этому и спрашиваю....


 
Джо ©   (2005-11-17 22:10) [7]


> и всё-равно срабатывало только "стандарный" обработчик исключений

Поставь точку останова на строке on ESocketError... и убедись, что при исключении управление передается на эту строку. Если не передается, то убедись, что возбуждается именно исключение типа ESocketError.


 
Джо ©   (2005-11-17 22:15) [8]

А, еще возможно, ты невнимательно прочитал диалоговое окно стандартного обработчика. Там написано "Use Step or Run to continue".


 
markers ©   (2005-11-17 22:21) [9]

У меня не совсем стандартный обработчик, у меня EurekaLog


 
markers ©   (2005-11-17 22:21) [10]

Но енто не оно....


 
markers ©   (2005-11-17 22:23) [11]

Точку ставил не работает в тех местах...... У меня код вообще рабочий я просто хочу вылавливать обращения к несуществующему адресу...


 
Джо ©   (2005-11-17 22:41) [12]


>  [9] markers ©   (17.11.05 22:21)
> У меня не совсем стандартный обработчик, у меня EurekaLog

Всплывают все новые и новые подробности... Точнее, они не всплывают, их приходиться тянуть клещами :))
---
Что в докумментации по этой EurekaLog пишут, читал? Может, снеси эту штуку, да попробуй пользоваться стандартными средствами, глядишь - проблема и исчезнет.


 
markers ©   (2005-11-17 22:43) [13]

Всё проблема решена, она была в ClientType:=ctNotBlocking, что кстати это решает?


 
markers ©   (2005-11-17 22:44) [14]

Этот режим на что влияет?


 
Джо ©   (2005-11-17 22:48) [15]


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

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


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

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


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


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


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


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

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


 
markers ©   (2005-11-18 09:58) [19]

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


 
markers ©   (2005-11-18 09:58) [20]

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


 
markers ©   (2005-11-18 10:03) [21]

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


 
Digitman ©   (2005-11-18 10:10) [22]


> у 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:14) [23]

Ну я сделал так
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;
Он ловит её, но всё-равно потом идёт стандартная ошибка.


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

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


 
markers ©   (2005-11-18 11:09) [25]

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


 
Digitman ©   (2005-11-18 11:12) [26]

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

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


 
markers ©   (2005-11-18 11:12) [27]

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


 
markers ©   (2005-11-18 11:13) [28]

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


 
markers ©   (2005-11-18 11:15) [29]

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


 
Digitman ©   (2005-11-18 11:40) [30]


> markers


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

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

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

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


 
markers ©   (2005-11-18 13:58) [31]

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


 
Digitman ©   (2005-11-18 14:16) [32]


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


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


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


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


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


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


 
markers ©   (2005-11-18 14:46) [33]

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


 
Digitman ©   (2005-11-18 15:04) [34]


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.044 c
3-1129638648
Kor
2005-10-18 16:30
2005.12.04
Как перенисти БД с использованием BDE?


1-1131561034
Shopot
2005-11-09 21:30
2005.12.04
Можно ли создать объект...


2-1131719759
Still Swamp
2005-11-11 17:35
2005.12.04
Как создать N-мерный массив в рантайме.


3-1129836987
lra
2005-10-20 23:36
2005.12.04
выборка заданного количества записей с помощью sql-запроса


2-1131824166
Виталий80
2005-11-12 22:36
2005.12.04
Как сделать ф-цию парсинга