powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кеширование объектов исключений
13 сообщений из 13, страница 1 из 1
Кеширование объектов исключений
    #39547676
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как известно при raise объект исключения потом сам уничтожается.
Однако есть ли возможность обойти это и кешировать исключение, чтобы к примеру делать ему raise столько раз сколько захочется но при этом не создавая заново объект исключения.

Суть в том, что перед исключением проходит долгая операция, и типы исключений могут быть разные, при чем из-за лямбда функции исключение может быть еще и неизвестное на данный момент. Если возникло исключение то оно гарантировано будет возникать в будущем и дальше. Чтобы каждый раз не делать долгую операцию, хочется закешировать исключение чтобы именно оно каждый раз генерировалось с учетом всех кодов, полей и т.п.
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547677
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteОднако есть ли возможность обойти это и кешировать исключение, чтобы к примеру делать ему raise столько раз сколько захочется но при этом не создавая заново объект исключения.
Можно. Посмотри на EOutOfMemory.
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547679
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyX-CiteОднако есть ли возможность обойти это и кешировать исключение, чтобы к примеру делать ему raise столько раз сколько захочется но при этом не создавая заново объект исключения.
Можно. Посмотри на EOutOfMemory.
Не катит.. там соль в переопределении FreeInstance. У будущих еще не существующих исключений не факт что его будут переопределять и у почти всех текущих тоже самое.
К примеру надо закешировать EInOutError при чем с сохраненным ErrorCode... или например EMyErrorException у которого будут 2 поля MyMagicWord: string и MyMagicObject: TObject
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547681
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547686
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpX-Cite,

AcquireExceptionObject()
Тоже не катит.. При последующем raise объект уничтожится... т.к. эта функция всего лишь возвращает указательна объект исключения и исключает его из текущего фрейма
Код: pascal
1.
2.
Result := RaiseFrame^.ExceptObject;
    RaiseFrame^.ExceptObject := nil;



Мне надо
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var a: Exception;
procedure Test;
begin
  raise a;
end;
Button1Click
begin
  if Assigned(a) then Test;
  for k := 0 to 99999999999999999 do ;
  a := EMy.Create(a, b, c);
  Test;
end;


Сколько раз нажмут на кнопку, столько раз и должно быть исключение но кешированое.
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547688
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteНе катит.. там соль в переопределении FreeInstance. У будущих еще не существующих исключений не факт что его будут переопределять и у почти всех текущих тоже самое.
Перекрыть этот метод достаточно в одном базовом предке.
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547690
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyX-CiteНе катит.. там соль в переопределении FreeInstance. У будущих еще не существующих исключений не факт что его будут переопределять и у почти всех текущих тоже самое.
Перекрыть этот метод достаточно в одном базовом предке.
Вся модель исключений должна остаться такой же... после raise объект должен уничтожаться. Только в моем классе где исключение будет закешировано оно не должно уничтожаться..
Сторонние разработчики создавая в будущем свои исключения ничего не должны знать о том, что мой класс будет кешировать их исключения.
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547692
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Всё это звучит довольно странно, но если такого странного и правда хочется то перекрывать FreeInstance всё же придётся. Это не обязательно делать штатными средствами, можно через сделать перехватчик метода - System.Rtti.TVirtualMethodInterceptor;
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547693
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если метод, который генерирует исключение вызывается в многопоточной среде множеством потоков... Только 1 поток должен возбудить исключение... остальные должны получить его же уже из кеша.. Во первых это экономит ресурсы, если метод долгий до возбуждения исключения. Во вторых это исключает возбуждение некоего другого исключения не связанного с первым.
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547694
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ещё часа два буду под впечатлением идеи приложения, производительность которого решающим образом зависит от эффективности возбуждения исключений.
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547697
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЯ ещё часа два буду под впечатлением идеи приложения, производительность которого решающим образом зависит от эффективности возбуждения исключений.
Суть та же что описана здесь https://msdn.microsoft.com/ru-ru/library/dd642331(v=vs.110).aspx#mt31
Перед исключение может вызываться фабричный лямбда метод, который будет реализован кем-то неизвестным.. кто его знает что там будет, может файл копироваться 2 Тб. и в конце выдаст ошибку, чтобы 20 потоков не начали копирование 2 Тб необходимо кеширование исключения. Именно кеширование, потому что у объекта наследника Exception могут быть свои 10 полей, которые должны сохранится также, при перевозбуждении исключения.
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547700
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyX-Cite,

Всё это звучит довольно странно, но если такого странного и правда хочется то перекрывать FreeInstance всё же придётся. Это не обязательно делать штатными средствами, можно через сделать перехватчик метода - System.Rtti.TVirtualMethodInterceptor;
Точняк.. я и забыл что FreeInstance виртуальный...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  FException := aValue;
  FVmi := TVirtualMethodInterceptor.Create(FException.ClassType);
  FVmi.OnBefore :=
    procedure (aInstance: TObject; aMethod: TRttiMethod; const aArgs: TArray<TValue>; out aDoInvoke: Boolean;
      out aResult: TValue)
    begin
      if aMethod.Name = 'FreeInstance' then
        aDoInvoke := False;
    end;
  FVmi.Proxify(FException);


Вопрос решен через TVirtualMethodInterceptor
...
Рейтинг: 0 / 0
Кеширование объектов исключений
    #39547701
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот стандартный пример
Код: 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.
procedure TForm7.Button1Click(Sender: TObject);
begin
  FTest := TLazy<TForm>.Create
  (
    function: TForm
    var
      k: Integer;
    begin
      for k := 0 to 1000000000 do
        ;
      raise MyException.Create('My Exception');
    end,
    True
  );
end;

procedure TForm7.Button2Click(Sender: TObject);
begin
  FTest.Value.Show();
end;

procedure TForm7.FormDestroy(Sender: TObject);
begin
  FTest.Free();
end;



Представим что Button2 нажмут 250 раз или вызовут 250 разных потоков ну почти одновременно.. а если система многопроцессорная то 100% где-то будет одновременно.
Суть в том, что исключение будет кешировано для всех последующих вызовов.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кеширование объектов исключений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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