Пятница, 26 Апреля 2024, 20:34

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 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
Chief Technology Officer RoyalePlay Games
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
Chief Technology Officer RoyalePlay Games
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
Chief Technology Officer RoyalePlay Games
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
Chief Technology Officer RoyalePlay Games
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
Chief Technology Officer RoyalePlay Games
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
Chief Technology Officer RoyalePlay Games
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
Chief Technology Officer RoyalePlay Games
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
Chief Technology Officer RoyalePlay Games
arysДата: Воскресенье, 01 Апреля 2012, 20:48 | Сообщение # 19
почетный гость
Сейчас нет на сайте
Извеняюсь что не в тему но, mysb8-gc. Плз немог б ты связатся сомной, очень надо. V__agente@mail.ru

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

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