Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 01:20 30.05.24 
Компютри и Интернет
   >> Delphi
Всички теми Следваща тема *Кратък преглед

Тема Предотвратяване на грешка 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).




Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.