SASGIS - SAS.Планета
View Issue Details
0002010SAS.ПланетаРефакторингpublic09-07-2013 16:4309-07-2013 18:50
zed 
zed 
normalminorhave not tried
resolvedfixed 
121010 
131111131111 
0002010: Обработка ошибок в TThreadRegionProcessAbstract и TThreadCacheManagerAbstract
В этом потоке и всех его наследниках (операции с выделенной областью) зачем-то поставлен перехват исключений и ручной вывод сообщений через MessageBox. И это по-моему не верно и нужно разрешить исключениям всплывать на самый верх, дабы Эврика могла сгенерировать правильное сообщение.
No tags attached.
related to 0001943resolved zed Добавить перехват ексепшенов Эврикой в дополнительных тредах 
Issue History
09-07-2013 16:43zedNew Issue
09-07-2013 16:48vasketsovNote Added: 0012031
09-07-2013 16:53zedNote Added: 0012032
09-07-2013 17:13vdemidovNote Added: 0012033
09-07-2013 17:15vasketsovNote Added: 0012034
09-07-2013 17:20vasketsovNote Added: 0012035
09-07-2013 17:20zedNote Added: 0012036
09-07-2013 17:23vasketsovNote Added: 0012037
09-07-2013 17:26zedNote Added: 0012038
09-07-2013 18:35vdemidovNote Added: 0012039
09-07-2013 18:45zedNote Added: 0012040
09-07-2013 18:49zedStatusnew => resolved
09-07-2013 18:49zedFixed in Version => 131111
09-07-2013 18:49zedResolutionopen => fixed
09-07-2013 18:49zedAssigned To => zed
09-07-2013 18:50zedTarget Version => 131111
09-07-2013 18:50zedSummaryОбработка ошибок в TThreadRegionProcessAbstract => Обработка ошибок в TThreadRegionProcessAbstract и TThreadCacheManagerAbstract
09-07-2013 18:56zedRelationship addedrelated to 0001943

Notes
(0012031)
vasketsov   
09-07-2013 16:48   
Перехват исключений из рабочих потоков надо оставить, но скидывать их в очередь, а в основном потоке по таймауту нюхать эту очередь и генерить исключения из неё (можно одно на всю пачку, если все данные будут в это одно падать).
(0012032)
zed   
09-07-2013 16:53   
Зачем? И ты уверен, что сгенерированное исключение будет сколь-нибудь полезнее того месседж-бокса? В смысле стек вызовов и прочее, как ты через очередь и ручное генерирование пробросишь?
(0012033)
vdemidov   
09-07-2013 17:13   
Какая-то обработка ошибок должна быть для недебажной версии. Но даже для дренажной, я не уверен, что мы хотим чтобы программа полностью падала при ошибке экспорта.
(0012034)
vasketsov   
09-07-2013 17:15   
>Зачем?
Затем, что самые простые грабли из существующих - это raise из потока. Проще только объкты передавать по ссылке между хостом и DLL. Ну то есть оно конечно работать может быть даже и будет, но шаг вправо или шаг влево - расстрел всей программы.

>как ты через очередь и ручное генерирование пробросишь?
Нет ничего проще. Обычный TList с критической секцией (спин-лок), куда можно кидать ЛЮБЫЕ объекты, писатели кладут туда готовый объект, а читатель просто тащит оттуда всё что может и raise-ит объект (raise работает не только для исключений). То есть в общем случае, что сгенеришь в потоке, то и вылетит в основной.
Если не выделываться и ограничиться Exception-ами, то от них ClassName+Message в первом приближении более чем достаточно (и уж явно не хуже MessageBox-а), тогда можно будет свалить все исключения из очереди в один большой кумулятивный raise.
Наверняк нечто подообное уже есть в сасе, надо только поток нюхателя прикрутить и прокинуть эту очередь в рабочие потоки.

Или я чё-то не так понял?
(0012035)
vasketsov   
09-07-2013 17:20   
В идеале конечно хотелось бы в рабочем потоке перехватить исключение, отдать его Эврике, получить от неё результат (со стеком и т.п.), а в основной поток пропихнуть нечто минимально необходимое для реакции пользователя, например ClassName + Message + имя файла, куда результат работы Эврики слился.
(0012036)
zed   
09-07-2013 17:20   
>я не уверен, что мы хотим чтобы программа полностью падала при ошибке экспорта
Почему программа полностью? Мне казалось, что вылететь должен только один поток.

>ClassName+Message в первом приближении более чем достаточно
В том то и дело, что мало. Нужен стек вызовов.
(0012037)
vasketsov   
09-07-2013 17:23   
>казалось, что вылететь должен только один поток
Один поток вылетает гарантировано. Остальное - как повезёт.

>Нужен стек вызовов
Мы можем попросить Эврику дать нам всю нужную инфу при перехвате исключения в рабочем потоке?
(0012038)
zed   
09-07-2013 17:26   
>В идеале конечно хотелось бы в рабочем потоке перехватить исключение, отдать его Эврике, получить от неё результат
Хм, а вот тут надо подумать и почитать маны по Эврике, возможно что-то и получится.
(0012039)
vdemidov   
09-07-2013 18:35   
>Почему программа полностью? Мне казалось, что вылететь должен только один поток.
Я думал, что если исключение добралось до эврики то она должна создать елф-файли и закрыть всю программу.
(0012040)
zed   
09-07-2013 18:45   
Не, Эврика сама по себе ничего не закрывает. Она только логи пишет. Но в окошке с ошибкой есть галочка Terminate, по которой может и прибить приложение.

В общем, добавил пару строчек и теперь Эврика будет обрабатывать ошибки своими методами. При этом, насколько я понимаю, рабочий поток будет завершаться в штатном порядке, аналогично случаю с месседж-боксом.