|
|
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
Как известно при raise объект исключения потом сам уничтожается. Однако есть ли возможность обойти это и кешировать исключение, чтобы к примеру делать ему raise столько раз сколько захочется но при этом не создавая заново объект исключения. Суть в том, что перед исключением проходит долгая операция, и типы исключений могут быть разные, при чем из-за лямбда функции исключение может быть еще и неизвестное на данный момент. Если возникло исключение то оно гарантировано будет возникать в будущем и дальше. Чтобы каждый раз не делать долгую операцию, хочется закешировать исключение чтобы именно оно каждый раз генерировалось с учетом всех кодов, полей и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 22:40:21 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
X-CiteОднако есть ли возможность обойти это и кешировать исключение, чтобы к примеру делать ему raise столько раз сколько захочется но при этом не создавая заново объект исключения. Можно. Посмотри на EOutOfMemory. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 22:44:48 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyX-CiteОднако есть ли возможность обойти это и кешировать исключение, чтобы к примеру делать ему raise столько раз сколько захочется но при этом не создавая заново объект исключения. Можно. Посмотри на EOutOfMemory. Не катит.. там соль в переопределении FreeInstance. У будущих еще не существующих исключений не факт что его будут переопределять и у почти всех текущих тоже самое. К примеру надо закешировать EInOutError при чем с сохраненным ErrorCode... или например EMyErrorException у которого будут 2 поля MyMagicWord: string и MyMagicObject: TObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 22:49:31 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 22:52:40 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
alekcvpX-Cite, AcquireExceptionObject() Тоже не катит.. При последующем raise объект уничтожится... т.к. эта функция всего лишь возвращает указательна объект исключения и исключает его из текущего фрейма Код: pascal 1. 2. Мне надо Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Сколько раз нажмут на кнопку, столько раз и должно быть исключение но кешированое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 23:00:42 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
X-CiteНе катит.. там соль в переопределении FreeInstance. У будущих еще не существующих исключений не факт что его будут переопределять и у почти всех текущих тоже самое. Перекрыть этот метод достаточно в одном базовом предке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 23:02:34 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyX-CiteНе катит.. там соль в переопределении FreeInstance. У будущих еще не существующих исключений не факт что его будут переопределять и у почти всех текущих тоже самое. Перекрыть этот метод достаточно в одном базовом предке. Вся модель исключений должна остаться такой же... после raise объект должен уничтожаться. Только в моем классе где исключение будет закешировано оно не должно уничтожаться.. Сторонние разработчики создавая в будущем свои исключения ничего не должны знать о том, что мой класс будет кешировать их исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 23:08:08 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
X-Cite, Всё это звучит довольно странно, но если такого странного и правда хочется то перекрывать FreeInstance всё же придётся. Это не обязательно делать штатными средствами, можно через сделать перехватчик метода - System.Rtti.TVirtualMethodInterceptor; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 23:18:04 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
Если метод, который генерирует исключение вызывается в многопоточной среде множеством потоков... Только 1 поток должен возбудить исключение... остальные должны получить его же уже из кеша.. Во первых это экономит ресурсы, если метод долгий до возбуждения исключения. Во вторых это исключает возбуждение некоего другого исключения не связанного с первым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 23:24:54 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
Я ещё часа два буду под впечатлением идеи приложения, производительность которого решающим образом зависит от эффективности возбуждения исключений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 23:32:59 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
softwarerЯ ещё часа два буду под впечатлением идеи приложения, производительность которого решающим образом зависит от эффективности возбуждения исключений. Суть та же что описана здесь https://msdn.microsoft.com/ru-ru/library/dd642331(v=vs.110).aspx#mt31 Перед исключение может вызываться фабричный лямбда метод, который будет реализован кем-то неизвестным.. кто его знает что там будет, может файл копироваться 2 Тб. и в конце выдаст ошибку, чтобы 20 потоков не начали копирование 2 Тб необходимо кеширование исключения. Именно кеширование, потому что у объекта наследника Exception могут быть свои 10 полей, которые должны сохранится также, при перевозбуждении исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 23:41:28 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyX-Cite, Всё это звучит довольно странно, но если такого странного и правда хочется то перекрывать FreeInstance всё же придётся. Это не обязательно делать штатными средствами, можно через сделать перехватчик метода - System.Rtti.TVirtualMethodInterceptor; Точняк.. я и забыл что FreeInstance виртуальный... Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вопрос решен через TVirtualMethodInterceptor ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 23:55:33 |
|
||
|
Кеширование объектов исключений
|
|||
|---|---|---|---|
|
#18+
Вот стандартный пример Код: 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. Представим что Button2 нажмут 250 раз или вызовут 250 разных потоков ну почти одновременно.. а если система многопроцессорная то 100% где-то будет одновременно. Суть в том, что исключение будет кешировано для всех последующих вызовов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2017, 23:59:30 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39547700&tid=2041635]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
206ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 230ms |
| total: | 546ms |

| 0 / 0 |
