Перехват ошибки
|
|
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 символов не хватит, а писать начало... нету смысла без конца..
|
|
| |