Не работает отлов исключения у StringGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Не работает отлов исключения у StringGrid

Сообщение NTFS » 18.09.2011 13:52:32

Добрый день.

Очень странное поведение StringGrid.

В обработчике события написано:

Код: Выделить всё
 
  ShowMessage('1') ;
  try
  SG.RowCount:=4 ;
  except
    on E:Exception do begin
      ShowMessage('error get') ;
    end;
  end;
  ShowMessage('2') ;


При выполнении этого кода, сначала появляется сообщение с текстом "1", а потом сразу стандартное окно исключения Lazarus (Press ok to ignore, press cancel to kill). Никакого текста "error get" не появляется.
Т.е., конструкция try except не работает, что на мой взгляд, даже не баг, а просто повод переписать проект на чем-нибудь другом, дабы не встрять позже.

Путем вычеркивания всех событий во всей программе, установил, что конструкция try except начинает работать, если я убираю у объекта StringGrid события OnPrepareCanvas и OnSelectCell. Но приложение однопоточное - потому, все, что происходит в присваивании SG.RowCount, должно обрабатываться блоком try except, как я полагаю. При этом даже обрамление кода этих обработчиков в свои собственные блоки try..except не помогает - только полное удаление.

Windows Vista 32bit, Lazarus 0.9.30, FreePascal .2.4.2

Что это вообще происходит?

Добавлено спустя 9 минут 45 секунд:
На всякий случай, решил проверить, обрабатывает ли FPC исключения во вложенных процедурах.

Код: Выделить всё
program teste ;

{$mode objfpc}{$h+}
uses Sysutils;

procedure DoEx() ;
begin
  raise exception.Create('yyy') ;
end ;

begin

  try
  raise exception.Create('xxx') ;
  except
   on E:Exception do  Writeln(E.Message) ;
  end ;

  try
    DoEx ;
  except
   on E:Exception do  Writeln(E.Message) ;
  end ;

end.


Вывод программы очевиден и ожидаем.
xxx
yyy
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Не работает отлов исключения у StringGrid

Сообщение Sergei I. Gorelkin » 18.09.2011 15:35:56

Похоже на то, что возникает еще одно исключение во время обработки первого. Т.е. в методе SetRowCount (или в вызываемых им процедурах) есть еще один или несколько блоков try..except, внутри которых написано нечто приводящее к повторным исключениям при условии наличия обработчиков OnPrepareCanvas/OnSelectCell.
До твоего обработчика просто не доходит дело.

Сделай пример, на котором это можно воспроизвести, и помести в багтрекер.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Не работает отлов исключения у StringGrid

Сообщение NTFS » 18.09.2011 16:38:28

Как может не доходить до моего обработчика, если он должен ловить ЛЮБЫЕ исключения внутри него? В том числе ошибки обработки исключений?
В старом добром Delphi 5 я делал так:

Код: Выделить всё
try
  Application.Run() ;
except
on E:Exception do  ShowMessage(E.Exception) ;
end  ;


и все было прекрасно, без зависимости от того, что там внутри приложения.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Не работает отлов исключения у StringGrid

Сообщение Sergei I. Gorelkin » 18.09.2011 18:22:13

NTFS писал(а):Как может не доходить до моего обработчика, если он должен ловить ЛЮБЫЕ исключения внутри него? В том числе ошибки обработки исключений?

Например, вот так:
Код: Выделить всё
procedure foo;
try
  //------------------ что-то внутри кода TStringGrid
  try
    raise exception.create('');
  except
    foo;
  end;
//-------------------
except
// здесь твой обработчик
end;

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

NTFS писал(а):и все было прекрасно, без зависимости от того, что там внутри приложения.

В Дельфи 5 этого еще не было, но в седьмом есть обработчик исключений вокруг оконной процедуры, так что из Application.Run ни одно исключение не выходит.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Не работает отлов исключения у StringGrid

Сообщение NTFS » 18.09.2011 18:47:19

В моем случае, идет List index out of boubd.

Я чего боюсь? что дело не в Lazarus, который и так никогда не был 100% стабильной средой, а в FPC.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Не работает отлов исключения у StringGrid

Сообщение Sergei I. Gorelkin » 18.09.2011 19:19:18

Слабое место FPC в плане обработки исключений - межмодульное взаимодействие (исключение, брошенное в DLL, пролетает мимо обработчика в программе). Кроме того, известен баг с утечкой первого исключения, если из блока finally бросается второе исключение. Но в остальном они работают.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Не работает отлов исключения у StringGrid

Сообщение NTFS » 18.09.2011 19:31:21

Ну и ладно, значит, все в порядке. А проблему я решил путем установки/снятия флага, блокирующего конкретные события - выглядит криво, но все работает.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru