Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / И снова OnException / 25 сообщений из 40, страница 1 из 2
20.10.2021, 10:14
    #40105517
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Доброго дня, форумчане!

Есть 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.
procedure TfrmMain.CatchException(Sender: TObject; E: Exception);
var
  LOraError: EOraError;
  LOraCode: Integer;
  LText: UTF8String;
begin
  if E is EOraError then
  begin
    LOraError := EOraError(E);
    LOraCode := LOraError.ErrorCode;
    if (LOraCode = 3113) or // 3113: принят сигнал конца файла по коммуникационному каналу
      (LOraCode = 3114) or // 3114: нет связи с ораклом
      (LOraCode = 12560) or // 12560: TNS:ошибка адаптера протокола
      (LOraCode = 28) or // 28: ORA-00028: Ваш сеанс удален
      (LOraCode = 1012) // 1012: ORA-01012: Вы не не вошли в систему
    then
    begin
      GMngDB.DefSession.Connected := False;
      FDBSession.Connected := False;
      LText := Format
        ('OnException: Sender - %s. OraError. Code = %d; ErrorText = "%s"',
        [Sender.ClassName, LOraCode, LOraError.message]);
      AddLog(LText); //запись в лог
    end
    else
      RaiseOraError(LOraCode, LOraError.message);
  end
  else
    RaiseError(E.message);
end;
...
Рейтинг: 0 / 0
20.10.2021, 11:24
    #40105535
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Могу дать такие совет - как действовать при вероятности нестабильной связи с СУБД:

1. Никаких запросов к БД по таймеру не должно быть. Все запросы должны быть либо как реакция на действие пользователя, либо в дополнительном потоке (с использованием отдельного подключения к БД)
2. В главном потоке разместить таймер, цель которого - тестирование наличия подключения к базе данных. Если подключение пропало, то выдаём на экран окно уведомления об отсутствии подключения к БД. Далее периодически пытаемся восстановить подключение к базе данных, если это удалось, то уведомление убираем.
3. Для отображения данных не использовать датасеты, имеющие привязку к БД. Лучше сперва выполнить запрос к БД с помощью такого датасета, затем перелить данные в другой (in-memory) датасет. В этом случае при кратковременных разрывах соединения работа пользователя не нарушится.
...
Рейтинг: 0 / 0
20.10.2021, 11:37
    #40105539
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
По возможности не используйте DBAware компоненты.

И GUI будет выглядеть лучше, и работать будет стабильней.
...
Рейтинг: 0 / 0
20.10.2021, 11:49
    #40105543
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
По таймеру проверяется время последнего действия. Если больше заданного, то приложение должно отключиться от базы данных.
Последнее действие записывается в БД. Рад бы не использовать, но...
...
Рейтинг: 0 / 0
20.10.2021, 11:52
    #40105547
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
DmSer

3. Для отображения данных не использовать датасеты, имеющие привязку к БД. Лучше сперва выполнить запрос к БД с помощью такого датасета, затем перелить данные в другой (in-memory) датасет. В этом случае при кратковременных разрывах соединения работа пользователя не нарушится.

Это будет проблематично. АРМ сильно большой, переделок много, клиент вряд ли будет оплачивать, мой шеф тоже не обрадуется
...
Рейтинг: 0 / 0
20.10.2021, 12:02
    #40105553
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
rgreat
По возможности не используйте DBAware компоненты.


+1
...
Рейтинг: 0 / 0
20.10.2021, 12:18
    #40105555
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
rgreat
По возможности не используйте DBAware компоненты.

И GUI будет выглядеть лучше, и работать будет стабильней.


Вы имеете ввиду Query-компоненты? Без них никак
...
Рейтинг: 0 / 0
20.10.2021, 12:31
    #40105556
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Леонов ЮрийВы имеете ввиду Query-компоненты?

Нет, db-aware controls. TDBGrid, TDBEdit и прочую TDBХрень.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2021, 12:41
    #40105558
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Проще перелить данные (in-memory) датасет.
...
Рейтинг: 0 / 0
20.10.2021, 13:11
    #40105570
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Леонов Юрий,

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

Ну а точно ответит только разработчик под отладкой, поставить брейк и смотреть стек откуда ноги растут.
...
Рейтинг: 0 / 0
20.10.2021, 14:00
    #40105589
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Dimitry Sibiryakov

Нет, db-aware controls. TDBGrid, TDBEdit и прочую TDBХрень.

На всех дочерних формах есть гриды с данными, без них никак. И переливать данные в memory-датасеты не получится, там встречаются объемы очень огромные...
...
Рейтинг: 0 / 0
20.10.2021, 14:04
    #40105591
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Zelius
Леонов Юрий,

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

Ну а точно ответит только разработчик под отладкой, поставить брейк и смотреть стек откуда ноги растут.


Там нет таймеров, грешу на компонент Session, он может выдавать это сообщение (исходников нет).
В Application.OnException я и отлавливаю эти ошибки, но они всё равно появляются. Вот и пытаюсь разобраться почему
...
Рейтинг: 0 / 0
20.10.2021, 14:08
    #40105593
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Откройте для себя TStringGrid/TDrawGrid.
И где, по-вашему, эти "огромные объёмы" находятся сейчас?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2021, 14:13
    #40105595
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Dimitry Sibiryakov

Откройте для себя TStringGrid/TDrawGrid.
И где, по-вашему, эти "огромные объёмы" находятся сейчас?..

Может еще руками перекладывать данные в них? Вопрос изначально не в этом.
Я не могу погасить саму ошибку. Как она возникает - дело десятое. Почему я ее не могу перехватить в OnException?
...
Рейтинг: 0 / 0
20.10.2021, 14:17
    #40105596
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Леонов Юрий
Почему я ее не могу перехватить в OnException?

А ты не показал, в каком месте и как ты назначаешь обработчик.
...
Рейтинг: 0 / 0
20.10.2021, 14:21
    #40105598
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
ъъъъъ
Леонов Юрий
Почему я ее не могу перехватить в OnException?

А ты не показал, в каком месте и как ты назначаешь обработчик.

Ну если легче от этого станет, то вот
Код: pascal
1.
2.
3.
4.
5.
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Application.OnException := CatchException;
  ...
end;


Саму процедуру CatchException написал изначально
...
Рейтинг: 0 / 0
20.10.2021, 14:28
    #40105603
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Леонов Юрий
Ну если легче от этого станет, то вот

Это как-бы бесполезно. TCustomApplicationEvents сам без этого прекрасно справляется, навешивая свои обработчики куда следует.

Подозреваю, что тут намешано отовсюду понемножку и получается на выходе полный швах.
...
Рейтинг: 0 / 0
20.10.2021, 14:30
    #40105605
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Леонов Юрий,

ставишь брейк в CatchException и для каждого вызова смотришь откуда он пришел.
...
Рейтинг: 0 / 0
20.10.2021, 14:31
    #40105606
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Леонов Юрий,

возможно, что ты где-то душишь эти исключения. Или у тебя сторонний обработчик исключений.
...
Рейтинг: 0 / 0
20.10.2021, 14:31
    #40105607
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Zelius
Леонов Юрий,

ставишь брейк в CatchException и для каждого вызова смотришь откуда он пришел.

Дык, не приходит у него, вроде, в том-то и вопрос.
...
Рейтинг: 0 / 0
20.10.2021, 14:40
    #40105609
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
очень даже может быть, что собака зарыта в компонентах доступа
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2021, 14:46
    #40105612
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
Леонов ЮрийМожет еще руками перекладывать данные в них?

Да, именно так.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2021, 14:58
    #40105615
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
rgreat
По возможности не используйте DBAware компоненты.
И GUI будет выглядеть лучше, и работать будет стабильней.

Чего только ни узнаешь.
...
Рейтинг: 0 / 0
20.10.2021, 15:09
    #40105618
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
OnException дёргается вообще? Ну т.е. если исключение бросить самому? Если нет, то кто-то перезаписал обработчик. Напишите в Button1Click:
Код: pascal
1.
Application.OnException(nil, nil);


и зайдите туда по Step Into, чтобы посмотреть, кто же этот засранец.

Если OnException дёргается на ваше исключение, но не дёргается на желаемое, то, значит, желаемое не поднимается до верхнего уровня. Т.е., грубо говоря, где-то стоит:
Код: pascal
1.
2.
3.
4.
5.
6.
try
  // ...
except
  on E: Exception do
    ShowMessage(E.Message);
end;
...
Рейтинг: 0 / 0
20.10.2021, 15:30
    #40105623
Леонов Юрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова OnException
GunSmoker

Если OnException дёргается на ваше исключение, но не дёргается на желаемое, то, значит, желаемое не поднимается до верхнего уровня. Т.е., грубо говоря, где-то стоит:
Код: pascal
1.
2.
3.
4.
5.
6.
try
  // ...
except
  on E: Exception do
    ShowMessage(E.Message);
end;


Такие места есть при запуске каждой формы. Конструкции типа
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function CallForm: HRESULT;
var
  LForm: <class нужной формы>;
begin
  try
    LForm := <class нужной формы>.Create(Application);
    LForm.Init;
    LForm.Show;
    Result := 0;
  except
    on E: Exception do
    begin
      ShowDetailExceptionDlg(E); //это своя процедура отображения сообщений
      Result := -1;
    end;
  end;
end;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / И снова OnException / 25 сообщений из 40, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]