powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / И снова OnException
40 сообщений из 40, показаны все 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
И снова OnException
    #40105626
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов Юрий
Такие места есть при запуске каждой формы.

Ну, душишь эксцепшны, вот и они и не доходят.
Добавь в конец
Код: pascal
1.
2.
3.
    on E: Exception do
    begin
...


строчку
Код: pascal
1.
raise;
...
Рейтинг: 0 / 0
И снова OnException
    #40105627
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ, это не поможет. Мы и так смотрим все возможные ошибки в таком примере
Код: pascal
1.
2.
3.
4.
5.
6.
try
  ...
except
  on E: Exception do
    ...
end;


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

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

Такие места есть при запуске каждой формы. Конструкции типа
Код: 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;


Печально. Даже не знаю, что из этого хуже. Пожалуй, только строчка

Код: pascal
1.
end;


не заслуживает критики.
...
Рейтинг: 0 / 0
И снова OnException
    #40105634
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов Юрий
ъъъъъ, это не поможет. Мы и так смотрим все возможные ошибки в таком примере
Код: pascal
1.
2.
3.
4.
5.
6.
try
  ...
except
  on E: Exception do
    ...
end;



Raise ничего не даст

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

что конкретно не нравится?
...
Рейтинг: 0 / 0
И снова OnException
    #40105637
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонов Юрий
softwarer,

что конкретно не нравится?

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

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

Всё. Ни одна строчка из этой функции в хорошую реализацию не попадёт. Также не нравятся тупое копирование для каждого класса форм и - судя по HRESULT - извращённая работа с DLL.
...
Рейтинг: 0 / 0
И снова OnException
    #40105646
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

судя по HRESULT - извращённая работа с DLL.


Согласен. Это доставшаяся конструкция в наследство. Руки не доходят исправить. Опять таки объемы модулей большие...
...
Рейтинг: 0 / 0
И снова OnException
    #40105650
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerсудя по HRESULT - извращённая работа с DLL

Причём настолько извращённая, что результат не соответствует спецификации HRESULT.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
И снова OnException
    #40105729
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

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

ошибки бывают разные. Что конкретно имеете ввиду?

То и имею. Если эксепшен на Init возникнет
...
Рейтинг: 0 / 0
И снова OnException
    #40106093
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45
Леонов Юрий,

у вас ошибка возникает в dll, а ловить вы её пытаетесь в основном приложении?


Нет, я dll не использую. Всё в основном потоке
...
Рейтинг: 0 / 0
И снова OnException
    #40107219
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

скорее всего вызывать
Код: pascal
1.
2.
      GMngDB.DefSession.Connected := False;
      FDBSession.Connected := False;


в обработчике исключения, возникшем при работе с самим компонентом, опасно и уже бесполезно
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / И снова OnException
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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