Вторник, 20 Августа 2019, 23:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Перехват ошибки
Перехват ошибки
masb8ly-GCДата: Воскресенье, 26 Февраля 2012, 15:48 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Здравствуйте! Столкнулся с проблемой перехвата ошибки. При попытке подключения к серверу при условии, что сервер не существует выскакивает ошибка, а мне нужно перехватить эту ошибку и вместо нее вывести сообщение. Как это можно реализовать? Через try...except? Если да, то куда вставлять и примерчик перехвата если можно)
Вот код в котором нужно осуществлять перехват:
Code
      if ((Length(Edt1.text))<>0) and ((Length(Edt2.text))<>0) then
       begin
         btn1.Enabled:=False;
         edt2.Enabled:=False;
         edt1.Enabled:=False;
         ClientSocket.Port:=StrToInt(edt1.Text);
         ClientSocket.Host:=edt2.Text;
         ClientSocket.Address:=edt2.Text;
         ClientSocket.Active:=True;
         btn2.Tag:=1;
         btn2.Caption:='Отключится';
       end
       else
       ShowMessage('Введите IP и порт!');


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
BASSДата: Воскресенье, 26 Февраля 2012, 16:03 | Сообщение # 2
independent developer
Сейчас нет на сайте
Поскольку с классами Delphi знаком приблизительно, могу показать только так:
Code

try
begin
...// код, где возможна ошибка(запрос к серверу, в данном случае)
end
except
begin
...// код, сообщающий об ошибке - выполняется, если ненадёжный код выдал ошибку
end;


Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
karuyДата: Воскресенье, 26 Февраля 2012, 16:37 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Что-то вроди такого.
Code
if ((Length(Edt1.text))<>0) and ((Length(Edt2.text))<>0) then  
        begin  
          btn1.Enabled:=False;  
          edt2.Enabled:=False;  
          edt1.Enabled:=False;  
          ClientSocket.Port:=StrToInt(edt1.Text);  
          ClientSocket.Host:=edt2.Text;  
          ClientSocket.Address:=edt2.Text;
       try
          ClientSocket.Active:=True;
       except
          ShowMessage('error');
       end;
          btn2.Tag:=1;  
          btn2.Caption:='Отключится';  
        end  
        else  
        ShowMessage('Введите IP и порт!');
masb8ly-GCДата: Воскресенье, 26 Февраля 2012, 16:41 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Спасибо, но все равно не заработало(

Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
BASSДата: Воскресенье, 26 Февраля 2012, 16:45 | Сообщение # 5
independent developer
Сейчас нет на сайте
Если программа компилируется - попробуй в режиме пошагового выполнения (F7) прогнать, проверяя значения переменных. Так ты узнаешь, где именно ошибка, а дальше поставишь обработку исключений на эту строку. Ещё попробуй весь код в листинге, начиная с IF в секцию TRY поместить.

Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
TimKruzДата: Воскресенье, 26 Февраля 2012, 17:00 | Сообщение # 6
старожил
Сейчас нет на сайте
Quote (masb8ly-GC)
но все равно не заработало(

А как ты проверяешь? Если такой код запустить через среду Delphi, то среда всё равно выдаст сообщение об ошибке. Если же скомпилировать программу и запустить полученный exe из Windows, то ошибка будет обработана твоим кодом, и "левых" сообщений об ошибке не будет.
Quote (karuy)
try
ClientSocket.Active:=True;
except
ShowMessage('error');
end;

Свойство ClientSocket.Active, как я понимаю, активирует сокет, пытается подключиться, и только после этого возвращает управление? Если да, то код выше будет работать правильно.


masb8ly-GCДата: Воскресенье, 26 Февраля 2012, 17:28 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
Quote (TimKruz)
Свойство ClientSocket.Active, как я понимаю, активирует сокет, пытается подключиться, и только после этого возвращает управление? Если да, то код выше будет работать правильно.

Понимаете правильно, проверял не через делфи, а после компиляции, но работать всеравно отказался этот кусочек кода


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
BASSДата: Воскресенье, 26 Февраля 2012, 18:59 | Сообщение # 8
independent developer
Сейчас нет на сайте
Попробуй весь код в обработку закинуть.

Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
masb8ly-GCДата: Воскресенье, 26 Февраля 2012, 21:11 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
Ну а я как делал?

Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
BASSДата: Воскресенье, 26 Февраля 2012, 21:17 | Сообщение # 10
independent developer
Сейчас нет на сайте
Ну тебе виднее. А что за ошибка? Текст или скрин не помешал бы.

Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
daunДата: Воскресенье, 26 Февраля 2012, 23:17 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
Тоже было, сначала пинговал простым...
Code

        f.TcpClient1.RemoteHost:=f.Edit1.Text;
        f.TcpClient1.RemotePort:=inttostr(Porta);
        f.TcpClient1.Active:=true;
        f.TcpClient1.Open;
        //.............................................
        if f.TcpClient1.Connected then begin
           if f.Edit2.Text<>'' then begin
              f.IdTCPClient1.Host:=f.Edit1.Text;     
              f.IdTCPClient1.Port:=Porta;
              f.IdTCPClient1.Connect;

...вроде работало.
masb8ly-GCДата: Понедельник, 27 Февраля 2012, 17:29 | Сообщение # 12
постоянный участник
Сейчас нет на сайте


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
BASSДата: Понедельник, 27 Февраля 2012, 17:33 | Сообщение # 13
independent developer
Сейчас нет на сайте
Вот почитай.

Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
masb8ly-GCДата: Понедельник, 27 Февраля 2012, 21:19 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
Спасибо за ссылку, но это немного не то! У меня ошибка выскакивает только, если отсутствует сервер. Тут нужно перехватывать, но я пока не могу понять как...

Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
BASSДата: Понедельник, 27 Февраля 2012, 21:26 | Сообщение # 15
independent developer
Сейчас нет на сайте
Ну тут, по-моему, два варианта:

  • Грести в сторону RAISE;
  • Кидать в TRY...EXCEPT весь код от "begin" до "end."

По идее, такая конструкция должна помочь защититься... Но не локализовать ошибку. Почитай документацию, примеры поищи - ведь не у одного тебя на планете такое.


Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.

Сообщение отредактировал BASS - Понедельник, 27 Февраля 2012, 21:31
masb8ly-GCДата: Понедельник, 27 Февраля 2012, 21:40 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
Ну будем думать) Спасибо!

Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
karuyДата: Понедельник, 27 Февраля 2012, 21:44 | Сообщение # 17
заслуженный участник
Сейчас нет на сайте
Кстати сокет у тебя асинхронный, поэтому ошибка лезет там где ее не ожидается увидеть, и поэтому трай ексепт не срабатывает. Ошибку нужно обрабатывать в OnError(), к примеру если присвоить ErrorCode := 0, то исключения вобше не будет лезть.

Добавлено (27.02.2012, 21:44)
---------------------------------------------

Quote (BASS)
Ну тут, по-моему, два варианта:

Грести в сторону RAISE;
Кидать в TRY...EXCEPT весь код от "begin" до "end."

По идее, такая конструкция должна помочь защититься...

Не должна, почему описал више.
masb8ly-GCДата: Среда, 29 Февраля 2012, 13:11 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
karuy, ОГРОМНОЕ спасибо за помощь! Таким образом и буду решать проблему!

Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
arysДата: Воскресенье, 01 Апреля 2012, 20:48 | Сообщение # 19
почетный гость
Сейчас нет на сайте
Извеняюсь что не в тему но, mysb8-gc. Плз немог б ты связатся сомной, очень надо. V__agente@mail.ru

500 символов не хватит, а писать начало... нету смысла без конца..
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Перехват ошибки
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2019 Рейтинг