powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / И снова OnException
25 сообщений из 40, страница 1 из 2
И снова OnException
    #40105517
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня, форумчане!

Есть 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
И снова OnException
    #40105535
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу дать такие совет - как действовать при вероятности нестабильной связи с СУБД:

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

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

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

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


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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

Чего только ни узнаешь.
...
Рейтинг: 0 / 0
И снова OnException
    #40105618
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
И снова OnException
    #40105623
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 40, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / И снова OnException
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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