Форум: "Начинающим";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Вниз
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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.055 c