|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
Коллеги, здравствуйте! Иногда бывает задача при обработке исключения, дописать в его Message детализирующую информацию и сделать reraise. Много лет пользуюсь таким механизмом: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9.
Был уверен, что механизм надежный. Но сегодня обнаружил, что такой механизм по-разному работает для разных классов исключений. См. пример: Код: 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74.
ВОПРОС . Что такого особенного в EAccessViolation, что он работает иначе, чем другие классы исключений? Почему изменение EAccessViolation.Message, как указано выше в TForm1.Button3Click, игнорируется, тогда как в аналогичной ситуации изменение EMyExeption.Message учитывается? Если реально есть что-то особенное в EAccessViolation, то где это описано? Спасибо! ------ Delphi2007 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 02:48 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
Dimitry Timokhov, :). а если вместо raise; написать: Код: pascal 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 03:18 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
Dimitry Timokhov Был уверен, что механизм надежный. Зря. Это очевидный хак, который имеет все шансы даже там, где работает - перестать в любой момент. Dimitry Timokhov Что такого особенного в EAccessViolation, что он работает иначе, чем другие классы исключений? Долго объяснять словами, проще заглянуть в исходники и увидеть. Если коротко, то EAccessViolation - обёртка для виндового исключения, и в его случае объект EAccessViolation пересоздаётся во время raise. Dimitry Timokhov Если реально есть что-то особенное в EAccessViolation, то где это описано? Надо просто пользоваться корректными механизмами. В данном случае это Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 03:33 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
ъъъъъ, Варианты есть. Один из вариантов с AcquireExceptionObject я привел. Вашим вариантом не пользовался, но навскидку он тоже рабочий. Удивительно само поведение - чем таким EAccessViolation отличается от моего класса исключения EMyException? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 03:34 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
softwarer Долго объяснять словами, проще заглянуть в исходники и увидеть. Если коротко, то EAccessViolation - обёртка для виндового исключения, и в его случае объект EAccessViolation пересоздаётся во время raise. Вот хотелось бы это увидеть))) Навскидку не нашел. Правда, не так сильно искал, т.к. быстро вспомнил про AcquireExceptionObject и переписал через него. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 03:39 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
...интересно. :) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 03:40 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
А к чему все эти приключения? Автор таким образом пытается отследить какой AV у него дал ошибку? Так вроде это соверешенно по другому делается :) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 10:20 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
GetExceptionObject.CreateAVObject - тч он в самом деле особенный. Добавление к Message интересное, как-то не обращал внимания, что оно доступно и на запись. Не сказал бы, что это хак, скорее вольность в интерфейсе, которую вряд ли станут убирать (хотя и могут) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 11:06 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
RaiseOuterException? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 11:57 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
По теме могут помочь https://www.gunsmoker.ru/2010/04/exception-delphi-2009.html ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 13:40 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
Тут уже и без меня всё сказали: 1. EAccessViolation - обёртка вокруг аппаратного исключения. При raise; перебрасывается исходное исключение, а дельфёвая обёртка пересоздаётся в каждом блоке except. 2. raise EMyException - программное исключение, при raise; оно же и перебрасывается, обёрток нет. 3. AcquireExceptionObject - возможный обходной путь. 4. Но правильное решение - RaiseOuterException (или его аналог для старых версий RTL). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 16:08 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
GunSmoker, Век живи - век учись. Лет 20 пользуюсь подобным механизмом и иногда удивлялся, почему AV не содержат доп. информацию. Теперь понятно. ==== Спасибо всем, кто проявил внимание к моему вопросу. ==== Александр, вопрос в тему, если не против. Сильно сложно начать использовать www.eurekalog.com? Это же ваш продукт, насколько помню. Как раз сегодня засбоил jedi при построении лога у одного из заказчиков. Лет 20 назад взял их разработку, но, видимо, пришло время менять. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 18:47 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
Dimitry Timokhov Сильно сложно начать использовать www.eurekalog.com? Это же ваш продукт, насколько помню. Я один из разработчиков, но это не мой продукт. Насчёт "сложно" - мне, как разработчику, очевидно насколько это просто/понятно для пользователя - другой вопрос. У нас, мне кажется, достаточно подробные доки с кучей примеров. Если пользователь знаком с основами и принципами исключений в Delphi, то не думаю, что какие-то проблемы будут. А то бывают кадры, которые Range Check отключают и жалуются, что EurekaLog не ловит "исключение". Кому-то про except { тут ничего } end приходится разжёвывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 18:53 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
GunSmoker, Спасибо. Мне в свое время Rouse_ хвалил Еврику. Попробую, как разгружусь чуток. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2021, 21:05 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
Dimitry Timokhov GunSmoker, Сильно сложно начать использовать www.eurekalog.com? Поверь мне Дима. Несложно ничуть. В Эврике всё или почти всё уже сделано для простого и для продвинутого пользователя. Это тебе говорю я, Германн с ДМ, который и не совсем программист, а просто ПШП. Если я её освоил, то тебе-то какие проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 03:04 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
2 GunSmoker Пользуясь случаем, почти по сабжу: Когда возникает exception, а в try..except делается raise нового, то в EL репорт идет нижнее(первое) исключение, а вот в EL Filters обрабатывается верхнее. Я себе час мозг ломал в попытках понять, почему так) В итоге решил вопрос через EurekaLogEvents ExceptionNotify - делаю костыли типа Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9.
и так фильтрую. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 03:36 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
Vizit0r, в этом месте меня вставляет вывернутая наизнанку логика, порождающая постоянные NOT: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 06:29 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
softwarer, Не увидел ничего сверхъестественного. Компактно и нормально читается. Предложи вариант лучше ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 13:17 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
Vizit0r Когда возникает exception, а в try..except делается raise нового, то в EL репорт идет нижнее(первое) исключение, а вот в EL Filters обрабатывается верхнее. Я себе час мозг ломал в попытках понять, почему так) Дело в том, что в RTL есть только одно исключение - то, которое выбрасывается. Поэтому к нему-то фильтры и применяются. И не только фильтры, вообще вся работа идёт с ним. Все предыдущие исключения (которые в inner сохраняются) - это уже обвес EL. Т.е. в код была специально добавлена конструкция, которая вместо текущего исключения (как это в Delphi по дефолту происходило бы) в баг репорт запишет исходное. Иными словами, это специальный случай, который обрабатывается явно. Возможно, стоит добавить новую галку "к чему применять" в свойства фильтра? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 13:26 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
white_nigger Компактно и нормально читается. Потому что эту конкретную процедуру писал я. Когда такое пишет другой программист, оно обычно вдвое толще. white_nigger Предложи вариант лучше Да запросто. Задать правильный вопрос - и уйдёт необходимость имитировать 3-позиционный переключатель с помощью двух булёвых переменных. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
вот так я предпочёл бы это написать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 13:55 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
Вот это softwarer Код: pascal 1.
Код: pascal 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 14:06 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
_Vasilisk_, раз я привожу к TObject - значит, он типа pointer. Так что так точно не получится. Почему InheritsFrom, а не is - сейчас уже точно не скажу. Возможно, что можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 14:21 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
softwarer Потому что эту конкретную процедуру писал я. Когда такое пишет другой программист, оно обычно вдвое толще. softwarer вот так я предпочёл бы это написать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 20:24 |
|
Правка Exception.Message при обработке исключения
|
|||
---|---|---|---|
#18+
white_nigger Корона не жмёт? Нет, она у меня масштабируемая. white_nigger Здесь вообще-то контракт другой Гениально. И зачем ты вообще задавал вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2021, 20:33 |
|
|
start [/forum/topic.php?fid=58&msg=40119719&tid=2036782]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 268ms |
total: | 410ms |
0 / 0 |