|
Тема
|
Предотвратяване на грешка 11001 в tClientSocket
|
|
Автор | 11OO1 (Нерегистриран) |
Публикувано | 21.04.07 10:41 |
|
Предотвратяване на грешка 11001 в tClientSocket.
Как се борите с кофти въведен host в tClientSocket?
С Try except и Error:=0 (последното - в OnError) не става.
Струва ми се не много умно да прехващам изключенията на цялото приложение.
Не може да няма нещо по-хитро, но не го откривам.
Мога да пингна хоста преди да се опитам да го отворя, ама и това не ми харесва.
И по-подробно: един клиенсти сокет трябва периодично да се опитвам да го свързвам към сървърски.
Ако е зададен несъществуващ хост при всеки опит за връзка излиза потребителско съобщение за изключение и тия съобщения се трупат на екрана.
Ще съм благодарен
| |
Тема
|
Re: Предотвратяване на грешка 11001 в tClientSocke
[re: 11OO1]
|
|
Автор |
Beco_ (Bluser) |
Публикувано | 21.04.07 18:59 |
|
Защо ще е лоша идея да пингваш хоста? Няма 100% гаранция, че потребителя е въвел верен ИП адрес/име на хост, но все пак би могъл да хванеш грубите грешки. Като алтернативен вариант на пинг, защо не напишеш и клиентска/сървърна процедурка, която напр. да изпраща стринга "тест" към сървъра, а той да връща ОК?
Не твърдя със 100% сигурност, но според мен try/catch блока и съответния му еквивалент в Паскал със сигурност хващат всички грешки при кофти зададен сървърен хост.
| |
Тема
|
Tova vremenno go zariazvam :(
[re: Beco_]
|
|
Автор | 11OO1 (Нерегистриран) |
Публикувано | 21.04.07 20:04 |
|
Tova vremenno go zariazvam :(
Za 2-3 dni imam po-speshna zadacha,
Dnes 3-4 chasa se opitvah da vidia kak sym reshil podoben problem v edin star proekt (3-4 godini) i ne uspiah :)
Това временно го зарязвам (2-3 дни имам много спешен проблем), но трябва да го направя тоя сокет.
В един проект от преди 3-4 години съм го решил някакси и помня, че правих нещо друго, освен try/Except и OnError, но дне 3-4 часа го рових (клиентът е 320 000 реда), но не го открих - срам, срам :)
Стигам до tApplication (Uses Forms) - в стария проект FOnException е Assigned, в новия не е.
А юнитите (моите юнити), с които са компилирани двата проекта са едни и същи. Направо да побеснях - не мога да видя как съм прихванал хендлера на изключенията на апликейшъна (проверих всякви начини, които съм ползвал през годините - и не го намерих).
procedure TApplication.HandleException(Sender: TObject);
begin
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
if ExceptObject is Exception then
begin
if not (ExceptObject is EAbort) then
if Assigned(FOnException) then
FOnException(Sender, Exception(ExceptObject))
else
ShowException(Exception(ExceptObject));
end else
SysUtils.ShowException(ExceptObject, ExceptAddr);
end;
Впрочем, вика се от
procedure TCustomWinSocket.WndProc(var Message: TMessage);
begin
try
Dispatch(Message);
except
Application.HandleException(Self);
end;
end;
Проверих подробно и ползваната хватка с пренаписваната на
function SetErrorProc(ErrorProc: TSocketErrorProc): TSocketErrorProc;
НИЩО - НИКАКЪВ РЕЗУЛТАТ - ексцепшъна пак си излиза 11001 - ба си!
| |
Тема
|
Re: Tova vremenno go zariazvam :(
[re: 11OO1]
|
|
Автор |
Beco_ (bluser) |
Публикувано | 22.04.07 19:24 |
|
Това са 3 различни начина за прихващане на изключенията - try/catch, OnError() на TClientSocket, TApplication->HandleException(). Аз лично бих се опитал да прихвана изключението с един от 3-те варианта във форма пресъздаваща ситуациата с минимално количество код.
| |
Тема
|
Хубава идея
[re: Beco_]
|
|
Автор |
NikB (любопитен) |
Публикувано | 23.04.07 08:50 |
|
Благодаря ти за идеята
Хубава идея :), ама е трънлив орех :)
Трябва да намеря начин да я реализирам
В действителност, новото проектче е минимална версия и прави изключенията.
Старият проект е голям и ги отряботва.
Ще започна малко по малко да разкарвам наследници от стария проект и да гледам какво става.
Но ще трябва време.
А относно трите начина - грешките на сокетите се прехващат и с още една функция:
Unit ScktComp
Category
exception handling routines
type TSocketErrorProc = procedure(ErrorCode: Integer);
function SetErrorProc(ErrorProc: TSocketErrorProc): TSocketErrorProc;
| |
Тема
|
Re: Хубава идея
[re: NikB]
|
|
Автор | nettle (Нерегистриран) |
Публикувано | 24.04.07 13:20 |
|
може първо 'ръчно' да извикаш WSAAsyncGetHostByName и ако мине успешно да продължиш с TClientSocket
| |
Тема
|
Мисля, че WSAAsyncGetHostByName понякога е много б
[re: nettle]
|
|
Автор |
NikB (любопитен) |
Публикувано | 24.04.07 14:57 |
|
Мисля, че WSAAsyncGetHostByName понякога е много бавно.
Ако трябва да се конектна с 20 сървъра програмата дълго време ще се е успала.
А и да го направя в нишка - програмата няма да се е успала, но връзките ще се появяват бавно една след друга.
Впрочем, аз не съм 100% сигурен, но мисля, че понякога се бави.
| |
Тема
|
Освен това се дразня, че не виждам разликите
[re: nettle]
|
|
Автор |
NikB (любопитен) |
Публикувано | 25.04.07 10:16 |
|
Освен това се дразня, че не виждам разликите - не мога да рабера как съм го прехванал тоя ексцепшън 11001.
Каквото и решение да взема за в бъдеше (вкл. твоето предложение) - трябва да изясня тоя въпрос.
| |
Тема
|
НАМЕРИХ го, много странно
[re: 11OO1]
|
|
Автор |
NikB (любопитен) |
Публикувано | 25.04.07 13:01 |
|
НАМЕРИХ го, но е много странно.
Оказа се, че някога в стария проект ми е трябвал юнит AppEvnts (може би съм ползвал компонент ApplicationEvents).
В Initialization на юнита AppEvnts се създава TMultiCaster, който регистрира DoException за обработчик на Application.OnException.
procedure TMultiCaster.DoException(Sender: TObject; E: Exception);
var
I: Integer;
begin
FDispatching := True;
try
for I := Count - 1 downto 0 do
begin
AppEvents.DoException(Sender, E);
if not FDispatching then Break;
end;
finally
FDispatching := False;
end;
end;
И тъй като нищо друго не се обработва - изглежда всички изключения на приложението се маскират.
Много зле.
Те хората са си писали:
- приличало му на бъг.
По същество: Ще развия предложението на nettle - още повече, че в самата иницализация на сокетите се вика WSAAsyncGetHostByName, но грешката й предизвиква ексцепшън (смятам да прехвана ексцепшъна в моето обръщане към WSAAsyncGetHostByName).
| |
|
|
|
|