Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кеширование объектов исключений / 13 сообщений из 13, страница 1 из 1
03.11.2017, 22:40:21
    #39547676
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
Как известно при raise объект исключения потом сам уничтожается.
Однако есть ли возможность обойти это и кешировать исключение, чтобы к примеру делать ему raise столько раз сколько захочется но при этом не создавая заново объект исключения.

Суть в том, что перед исключением проходит долгая операция, и типы исключений могут быть разные, при чем из-за лямбда функции исключение может быть еще и неизвестное на данный момент. Если возникло исключение то оно гарантировано будет возникать в будущем и дальше. Чтобы каждый раз не делать долгую операцию, хочется закешировать исключение чтобы именно оно каждый раз генерировалось с учетом всех кодов, полей и т.п.
...
Рейтинг: 0 / 0
03.11.2017, 22:44:48
    #39547677
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
X-CiteОднако есть ли возможность обойти это и кешировать исключение, чтобы к примеру делать ему raise столько раз сколько захочется но при этом не создавая заново объект исключения.
Можно. Посмотри на EOutOfMemory.
...
Рейтинг: 0 / 0
03.11.2017, 22:49:31
    #39547679
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
Kazantsev AlexeyX-CiteОднако есть ли возможность обойти это и кешировать исключение, чтобы к примеру делать ему raise столько раз сколько захочется но при этом не создавая заново объект исключения.
Можно. Посмотри на EOutOfMemory.
Не катит.. там соль в переопределении FreeInstance. У будущих еще не существующих исключений не факт что его будут переопределять и у почти всех текущих тоже самое.
К примеру надо закешировать EInOutError при чем с сохраненным ErrorCode... или например EMyErrorException у которого будут 2 поля MyMagicWord: string и MyMagicObject: TObject
...
Рейтинг: 0 / 0
03.11.2017, 22:52:40
    #39547681
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
...
Рейтинг: 0 / 0
03.11.2017, 23:00:42
    #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
03.11.2017, 23:02:34
    #39547688
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
X-CiteНе катит.. там соль в переопределении FreeInstance. У будущих еще не существующих исключений не факт что его будут переопределять и у почти всех текущих тоже самое.
Перекрыть этот метод достаточно в одном базовом предке.
...
Рейтинг: 0 / 0
03.11.2017, 23:08:08
    #39547690
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
Kazantsev AlexeyX-CiteНе катит.. там соль в переопределении FreeInstance. У будущих еще не существующих исключений не факт что его будут переопределять и у почти всех текущих тоже самое.
Перекрыть этот метод достаточно в одном базовом предке.
Вся модель исключений должна остаться такой же... после raise объект должен уничтожаться. Только в моем классе где исключение будет закешировано оно не должно уничтожаться..
Сторонние разработчики создавая в будущем свои исключения ничего не должны знать о том, что мой класс будет кешировать их исключения.
...
Рейтинг: 0 / 0
03.11.2017, 23:18:04
    #39547692
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
X-Cite,

Всё это звучит довольно странно, но если такого странного и правда хочется то перекрывать FreeInstance всё же придётся. Это не обязательно делать штатными средствами, можно через сделать перехватчик метода - System.Rtti.TVirtualMethodInterceptor;
...
Рейтинг: 0 / 0
03.11.2017, 23:24:54
    #39547693
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
Если метод, который генерирует исключение вызывается в многопоточной среде множеством потоков... Только 1 поток должен возбудить исключение... остальные должны получить его же уже из кеша.. Во первых это экономит ресурсы, если метод долгий до возбуждения исключения. Во вторых это исключает возбуждение некоего другого исключения не связанного с первым.
...
Рейтинг: 0 / 0
03.11.2017, 23:32:59
    #39547694
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
Я ещё часа два буду под впечатлением идеи приложения, производительность которого решающим образом зависит от эффективности возбуждения исключений.
...
Рейтинг: 0 / 0
03.11.2017, 23:41:28
    #39547697
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование объектов исключений
softwarerЯ ещё часа два буду под впечатлением идеи приложения, производительность которого решающим образом зависит от эффективности возбуждения исключений.
Суть та же что описана здесь https://msdn.microsoft.com/ru-ru/library/dd642331(v=vs.110).aspx#mt31
Перед исключение может вызываться фабричный лямбда метод, который будет реализован кем-то неизвестным.. кто его знает что там будет, может файл копироваться 2 Тб. и в конце выдаст ошибку, чтобы 20 потоков не начали копирование 2 Тб необходимо кеширование исключения. Именно кеширование, потому что у объекта наследника Exception могут быть свои 10 полей, которые должны сохранится также, при перевозбуждении исключения.
...
Рейтинг: 0 / 0
03.11.2017, 23:55:33
    #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
03.11.2017, 23:59:30
    #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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кеширование объектов исключений / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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