Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка ошибки! try...except 
:(
    Опции темы
Susel
  Дата 13.1.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



Есть 2-а собственных компонента TMyPanel и TMyExtLookupEdit - наследники TPanel и TdxInplaceExtLookupEdit соответственно.
TMyPanel - связанные панели, т.е. есть ссылка (свойство такого же типа TMyPanel) на предыдущую панель PrevPanel и на следующую NextPanel.

Для TMyPanel определена процедура:
Код

    procedure CMVisibleChanged(var Message: TMessage);message CM_VISIBLECHANGED;
    ...
      if Visible and Assigned(FPrevPanel) then
        FPrevPanel.Enabled:=false; 
    ....


Для TMyExtLookupEdit переопределена процедура DoExit таким образом, что в случае неверного ввода генерируется ошибка:
Код
 raise Exception.Create... 


Есть форма содержащая MyPanel1 и MyPanel2. MyPanel1 содержит MyExtLookupEdit1. Форма имеет следующий код:
Код

      try
        curPanel.ShowNext;
      except
        curPanel.HideNext;
        raise;
      end;


ShowNext и HideNext равносильны curPanel.NextPanel.Visible:=true и curPanel.NextPanel.Visible:=false соответственно.

Проблема в том, что при возникновении ошибки (введено неверное значение в MyExtLookupEdit1) ошибка генерируется и сообщение об ошибке появляется, но управление не передается в блок except и следующая панель остается видимой.
PM MAIL   Вверх
_hunter
Дата 13.1.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



значит исключение бросает не curPanel.ShowNext


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Susel
Дата 13.1.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



В режиме трассировки ставлю точку остановки на curPanel.ShowNext в блоке try, нажимаю F8 - получаю ошибку, но управление блоку except не передается.... smile
PM MAIL   Вверх
Alexeis
Дата 13.1.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



В режиме трасировки и при запуске из delpi исключения вызываются всегда - это не значит что програма работает с ошибками.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Susel
Дата 13.1.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



alexeis1
Чёт не понял к чему это!?
При запуске exe - ошибка также успешно генерируется, но следующая панель не исчезает!

Это сообщение отредактировал(а) Susel - 13.1.2006, 17:44
PM MAIL   Вверх
ShadeSt
Дата 13.1.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



может быть такое что ты уже обрабатываешь эту ошибку..
Код

Procedure DoSome;
Begin
  Try
     что то с ошибкой
  Except
  End;
End;


Procedure ShowNext
Begin
  Try
    DoSome
  Except
    ShowMessage(...);
  End
End;


Получается что у тебя есть ошибка при вызове DoSome, но в процедуре ShowNext ты не попадешь в блок Except.


--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
Susel
Дата 13.1.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



ShadeSt
Проверял, нет такого.....
Да и как правило, если обрабатываю ошибки - ставлю raise, т.е. не подавляю сообщение об ошибке, как в твоем примере...
PM MAIL   Вверх
_hunter
Дата 13.1.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



Цитата(Susel @ 13.1.2006, 16:23 Найти цитируемый пост)

но управление блоку except не передается

а куда передается?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
ShadeSt
Дата 13.1.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Тогда интересно в обработчике какого события ошибка и где ты ее потом хочешь поймать?
Вне этого обработчика что ли?



--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
Susel
Дата 13.1.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



_hunter
Передается следующей за блоком try...except инструкции.......
PM MAIL   Вверх
ShadeSt
Дата 13.1.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Код

      try    
        curPanel.ShowNext;    
      except    
        curPanel.HideNext;    
        raise;    
      end;


Если ты хочешь поймать тут ошибку, то надо чтобы она была в процедуре ShowNext.
А исключение при неверном вводе, у тебя где?? в TEdit.OnExit?

Это сообщение отредактировал(а) ShadeSt - 13.1.2006, 18:09


--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
_hunter
Дата 13.1.2006, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



создай тестовый проект в котором просто кинь исключение и попробуй его поймать.
потом перенеси код в этот проект -- посмотри что будет.
может ты обработку исключений отключил...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Susel
Дата 13.1.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



Да, исключение можно сказать в OnExit (на самом деле в DoExit), но DoExit фактически вызывается в ShowNext, хотя и через сообщение винды......
Добавлено @ 18:34
_hunter
В блоке try сгенерировал деление на 0 - except отработал, однако если деление на ноль генерирую в DoExit - управление блоку except не передается......
PM MAIL   Вверх
_hunter
Дата 13.1.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



значит где-то в ShowNext стоит свой обработчик.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Susel
Дата 13.1.2006, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



Ну нет там обработчика....нет..... smile
Добавлено @ 19:16
Приведу больше кода:

Код

procedure TTrxSQLPanel.ShowNext;
begin
  if NextPanel<>nil then
    NextPanel.Show;
end;


Код

procedure TTrxSQLPanel.CMVisibleChanged(var Message: TMessage); \\Обработчик сообщения CM_VISIBLECHANGED
begin
... \\никаких обработчиков ошибок тут тоже нет
  if Visible then
  begin
  ...
        FPrevPanel.Enabled:=false;
        GetFirstCanFocus.SetFocus;
  ...
  end
...
end;



Код

procedure TTrxOraCustomExtLookupEdit.DoExit;
begin
...
        raise Exception.Create('Ошибка!');
...
  inherited;
end;

PM MAIL   Вверх
_hunter
Дата 13.1.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



так обработка сообщений идет в совсем другом контексте.
т.е. что происходит:
вызываем curPanel.ShowNext, она шлет сообщение, происходит выход из блока try ( потому как исключений нет ) курсор становится на строку за блоком и в это время сообщение доходит до адресата -- появляется исключение. ну а дальше все понятно smile



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Susel
Дата 13.1.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



_hunter
Т.е. исключение на ShowNext происходит только лишь в режиме трассировки!? На самом деле отрабатывают все инструкции после блока try...except, и только потом возникает ошибка!?
Добавлено @ 19:39
Где же её тогда перехватывать!?
PM MAIL   Вверх
_hunter
Дата 13.1.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



нет, в режиме "без отладки" это исключение тоже появится и тоже проскочи мимо.
ловить его нужно там, где оно бросается. т.е. на самом высоком уровне приемника сообщений.
в данном случае в CMVisibleChanged(


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Susel
Дата 14.1.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



Попробовал отловить в CMVisibleChanged - результат тот же.....при возникновении ошибки выполняется инструция следующая за блоком try...except... smile

Вот:
Код

procedure TTrxSQLPanel.CMVisibleChanged(var Message: TMessage);
begin
  try
  ...
          FPrevPanel.Enabled:=false;
  ...
  except
    raise;
  end;
  showmessage('Тест');
end;


Сначала появляется сообщение об ошибке, а затем появляется сообщение "Тест"...

Это сообщение отредактировал(а) Susel - 14.1.2006, 11:27
PM MAIL   Вверх
Alex
Дата 14.1.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Выложи здесть или пришли на почту, тестовый проект и свои компоненты


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Susel
Дата 14.1.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



Выкладываю тестовый пример с тестовыми компонентами. Расширение pas нужно изменить на rar.....

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Test.pas 4,56 Kb
PM MAIL   Вверх
Alex
Дата 15.1.2006, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Твое сообщение перехватывают в модуле Controls
Код

procedure TWinControl.MainWndProc(var Message: TMessage);
begin
  try
    try
      WindowProc(Message);
    finally
      FreeDeviceContexts;
      FreeMemoryContexts;
    end;
  except
    Application.HandleException(Self);
  end;
end;



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Susel
Дата 16.1.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



А как же мне его отловить!?
PM MAIL   Вверх
_hunter
Дата 16.1.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



замени оконную процедуру...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alex
Дата 16.1.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Можно конечно и заменить оконную процедуру, но может стоит подумать "стоит ли игра свечь?" Может проще поделиться с людьми идеей, которую хочешь сделать и они предложат вариант при котором не нужно будет переписывать все компоненты, которые хочется положить на эту панель...


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Susel
Дата 16.1.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



Да идея то прозрачна из примера, на форме есть набор связанных панелей, которые должны появляться друг за другом по нажатию определённой клавиши, при этом предыдущая панель не должна быть доступна для редактирования. Есть комбобокс, на который вешается некоторое условие проверки (на основе информации из БД) и в случае неудовлетворительной проверки комбобокс не должен терять фокуса, т.е. из него не возможно выйти, а следовательно и следующая панель не должна появиться.

Вот в общем то в кратце и вся идея (правда кроме перечисленного и панель и комбобокс обладают ещё рядом дополнительных возможностей, не относящихся к вопросу)
PM MAIL   Вверх
Alex
Дата 16.1.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



По мне проще проверку качества заполнения данных вынести из компонентов и делать ее перед созданием новой панели. Или кто мешает Вызвать OnExit у компонентов до создания новой панели?


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Susel
Дата 16.1.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



Цитата

По мне проще проверку качества заполнения данных вынести из компонентов и делать ее перед созданием новой панели.


Дело в том, что проверка содержимого производится при помощи SQL запроса, в качестве параметра используюещего введённое значение. Причем запрос для проверки настраивается (хранится в одной из системных таблиц).

Цитата

Или кто мешает Вызвать OnExit у компонентов до создания новой панели?


События OnExit для компонентов могут быть и не определены, а проверку делать нужно.....
Допустим что вызвали OnExit для всех компонентов, но в случае ошибки как я понял опять же ошибка будет перехвачена оконной процедурой!
PM MAIL   Вверх
Susel
Дата 18.1.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



Неужели данную проблему таки можно решить, только переписав оконную процедуру!? smile
PM MAIL   Вверх
_hunter
Дата 18.1.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



учитывая что это проблема места обработки...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2055 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.