Notes |
|
|
Перехват исключений из рабочих потоков надо оставить, но скидывать их в очередь, а в основном потоке по таймауту нюхать эту очередь и генерить исключения из неё (можно одно на всю пачку, если все данные будут в это одно падать). |
|
|
(0012032)
|
zed
|
09-07-2013 16:53
|
|
Зачем? И ты уверен, что сгенерированное исключение будет сколь-нибудь полезнее того месседж-бокса? В смысле стек вызовов и прочее, как ты через очередь и ручное генерирование пробросишь? |
|
|
|
Какая-то обработка ошибок должна быть для недебажной версии. Но даже для дренажной, я не уверен, что мы хотим чтобы программа полностью падала при ошибке экспорта. |
|
|
|
>Зачем?
Затем, что самые простые грабли из существующих - это raise из потока. Проще только объкты передавать по ссылке между хостом и DLL. Ну то есть оно конечно работать может быть даже и будет, но шаг вправо или шаг влево - расстрел всей программы.
>как ты через очередь и ручное генерирование пробросишь?
Нет ничего проще. Обычный TList с критической секцией (спин-лок), куда можно кидать ЛЮБЫЕ объекты, писатели кладут туда готовый объект, а читатель просто тащит оттуда всё что может и raise-ит объект (raise работает не только для исключений). То есть в общем случае, что сгенеришь в потоке, то и вылетит в основной.
Если не выделываться и ограничиться Exception-ами, то от них ClassName+Message в первом приближении более чем достаточно (и уж явно не хуже MessageBox-а), тогда можно будет свалить все исключения из очереди в один большой кумулятивный raise.
Наверняк нечто подообное уже есть в сасе, надо только поток нюхателя прикрутить и прокинуть эту очередь в рабочие потоки.
Или я чё-то не так понял? |
|
|
|
В идеале конечно хотелось бы в рабочем потоке перехватить исключение, отдать его Эврике, получить от неё результат (со стеком и т.п.), а в основной поток пропихнуть нечто минимально необходимое для реакции пользователя, например ClassName + Message + имя файла, куда результат работы Эврики слился. |
|
|
(0012036)
|
zed
|
09-07-2013 17:20
|
|
>я не уверен, что мы хотим чтобы программа полностью падала при ошибке экспорта
Почему программа полностью? Мне казалось, что вылететь должен только один поток.
>ClassName+Message в первом приближении более чем достаточно
В том то и дело, что мало. Нужен стек вызовов. |
|
|
|
>казалось, что вылететь должен только один поток
Один поток вылетает гарантировано. Остальное - как повезёт.
>Нужен стек вызовов
Мы можем попросить Эврику дать нам всю нужную инфу при перехвате исключения в рабочем потоке? |
|
|
(0012038)
|
zed
|
09-07-2013 17:26
|
|
>В идеале конечно хотелось бы в рабочем потоке перехватить исключение, отдать его Эврике, получить от неё результат
Хм, а вот тут надо подумать и почитать маны по Эврике, возможно что-то и получится. |
|
|
|
>Почему программа полностью? Мне казалось, что вылететь должен только один поток.
Я думал, что если исключение добралось до эврики то она должна создать елф-файли и закрыть всю программу. |
|
|
(0012040)
|
zed
|
09-07-2013 18:45
|
|
Не, Эврика сама по себе ничего не закрывает. Она только логи пишет. Но в окошке с ошибкой есть галочка Terminate, по которой может и прибить приложение.
В общем, добавил пару строчек и теперь Эврика будет обрабатывать ошибки своими методами. При этом, насколько я понимаю, рабочий поток будет завершаться в штатном порядке, аналогично случаю с месседж-боксом. |
|