|
И снова OnException
|
|||
---|---|---|---|
#18+
Доброго дня, форумчане! Есть MDI-приложение, написанное в Embarcadero 10.1 Berlin. Для работы с базой данных использую ODAC-компоненты. Из-за нестабильной связи (база в облаке, у клиента иногда барахлит инет) происходит обрыв связи. Для тестирования мы просто отрубаем сеть на локальном ПК. Раз в полторы секунды у меня срабатывает таймер, там идет обращение к БД. В случае разрыва связи генерируется ошибка ORA-03113: end-of-file on communication channel. В таймере я ее перехватываю и обрабатываю (делаю перезапуск программы). Но если были открыты какие-либо формы, кроме основной, то подобные сообщения показываются по количеству открытых форм. Решил их перехватывать в Application.OnException. Но они почему-то не перехватываются. В чём может быть причина? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 10:14 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Могу дать такие совет - как действовать при вероятности нестабильной связи с СУБД: 1. Никаких запросов к БД по таймеру не должно быть. Все запросы должны быть либо как реакция на действие пользователя, либо в дополнительном потоке (с использованием отдельного подключения к БД) 2. В главном потоке разместить таймер, цель которого - тестирование наличия подключения к базе данных. Если подключение пропало, то выдаём на экран окно уведомления об отсутствии подключения к БД. Далее периодически пытаемся восстановить подключение к базе данных, если это удалось, то уведомление убираем. 3. Для отображения данных не использовать датасеты, имеющие привязку к БД. Лучше сперва выполнить запрос к БД с помощью такого датасета, затем перелить данные в другой (in-memory) датасет. В этом случае при кратковременных разрывах соединения работа пользователя не нарушится. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 11:24 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
По возможности не используйте DBAware компоненты. И GUI будет выглядеть лучше, и работать будет стабильней. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 11:37 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
По таймеру проверяется время последнего действия. Если больше заданного, то приложение должно отключиться от базы данных. Последнее действие записывается в БД. Рад бы не использовать, но... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 11:49 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
DmSer 3. Для отображения данных не использовать датасеты, имеющие привязку к БД. Лучше сперва выполнить запрос к БД с помощью такого датасета, затем перелить данные в другой (in-memory) датасет. В этом случае при кратковременных разрывах соединения работа пользователя не нарушится. Это будет проблематично. АРМ сильно большой, переделок много, клиент вряд ли будет оплачивать, мой шеф тоже не обрадуется ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 11:52 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
rgreat По возможности не используйте DBAware компоненты. +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 12:02 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
rgreat По возможности не используйте DBAware компоненты. И GUI будет выглядеть лучше, и работать будет стабильней. Вы имеете ввиду Query-компоненты? Без них никак ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 12:18 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Леонов ЮрийВы имеете ввиду Query-компоненты? Нет, db-aware controls. TDBGrid, TDBEdit и прочую TDBХрень. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 12:31 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Проще перелить данные (in-memory) датасет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 12:41 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Леонов Юрий, наверное в каждой форме что то происходит, например проверка соединения по таймеру, или другое чтение из соединения, и как результат в каждой форме генерится исключение. как вариант, выставлять флаг что соединение потеряно и в других случаях не выводить ошибку базы данных или какую-то конкретную. Ну а точно ответит только разработчик под отладкой, поставить брейк и смотреть стек откуда ноги растут. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 13:11 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Нет, db-aware controls. TDBGrid, TDBEdit и прочую TDBХрень. На всех дочерних формах есть гриды с данными, без них никак. И переливать данные в memory-датасеты не получится, там встречаются объемы очень огромные... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:00 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Zelius Леонов Юрий, наверное в каждой форме что то происходит, например проверка соединения по таймеру, или другое чтение из соединения, и как результат в каждой форме генерится исключение. как вариант, выставлять флаг что соединение потеряно и в других случаях не выводить ошибку базы данных или какую-то конкретную. Ну а точно ответит только разработчик под отладкой, поставить брейк и смотреть стек откуда ноги растут. Там нет таймеров, грешу на компонент Session, он может выдавать это сообщение (исходников нет). В Application.OnException я и отлавливаю эти ошибки, но они всё равно появляются. Вот и пытаюсь разобраться почему ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:04 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Откройте для себя TStringGrid/TDrawGrid. И где, по-вашему, эти "огромные объёмы" находятся сейчас?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:08 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Откройте для себя TStringGrid/TDrawGrid. И где, по-вашему, эти "огромные объёмы" находятся сейчас?.. Может еще руками перекладывать данные в них? Вопрос изначально не в этом. Я не могу погасить саму ошибку. Как она возникает - дело десятое. Почему я ее не могу перехватить в OnException? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:13 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Леонов Юрий Почему я ее не могу перехватить в OnException? А ты не показал, в каком месте и как ты назначаешь обработчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:17 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
ъъъъъ Леонов Юрий Почему я ее не могу перехватить в OnException? А ты не показал, в каком месте и как ты назначаешь обработчик. Ну если легче от этого станет, то вот Код: pascal 1. 2. 3. 4. 5.
Саму процедуру CatchException написал изначально ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:21 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Леонов Юрий Ну если легче от этого станет, то вот Это как-бы бесполезно. TCustomApplicationEvents сам без этого прекрасно справляется, навешивая свои обработчики куда следует. Подозреваю, что тут намешано отовсюду понемножку и получается на выходе полный швах. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:28 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Леонов Юрий, ставишь брейк в CatchException и для каждого вызова смотришь откуда он пришел. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:30 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Леонов Юрий, возможно, что ты где-то душишь эти исключения. Или у тебя сторонний обработчик исключений. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:31 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Zelius Леонов Юрий, ставишь брейк в CatchException и для каждого вызова смотришь откуда он пришел. Дык, не приходит у него, вроде, в том-то и вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:31 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
очень даже может быть, что собака зарыта в компонентах доступа Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:40 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
Леонов ЮрийМожет еще руками перекладывать данные в них? Да, именно так. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:46 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
rgreat По возможности не используйте DBAware компоненты. И GUI будет выглядеть лучше, и работать будет стабильней. Чего только ни узнаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:58 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
OnException дёргается вообще? Ну т.е. если исключение бросить самому? Если нет, то кто-то перезаписал обработчик. Напишите в Button1Click: Код: pascal 1.
и зайдите туда по Step Into, чтобы посмотреть, кто же этот засранец. Если OnException дёргается на ваше исключение, но не дёргается на желаемое, то, значит, желаемое не поднимается до верхнего уровня. Т.е., грубо говоря, где-то стоит: Код: pascal 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 15:09 |
|
И снова OnException
|
|||
---|---|---|---|
#18+
GunSmoker Если OnException дёргается на ваше исключение, но не дёргается на желаемое, то, значит, желаемое не поднимается до верхнего уровня. Т.е., грубо говоря, где-то стоит: Код: pascal 1. 2. 3. 4. 5. 6.
Такие места есть при запуске каждой формы. Конструкции типа Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 15:30 |
|
|
start [/forum/topic.php?fid=58&msg=40105517&tid=2036932]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 271ms |
total: | 409ms |
0 / 0 |