Russian Qt Forum

Qt => Общие вопросы => Тема начата: niXman от Март 24, 2010, 03:55



Название: Как поймать исключение?
Отправлено: niXman от Март 24, 2010, 03:55
Есть поток. В методе run() некоторый код, который, возможно бросает исключение.
В данный момент, без "try {} catch () {}" блока, программа падает. Ну и пусть. Но! В объекте исключения содержится информация о причине его возникновения. Ее, очень нужно отобразить. Чтоб юзер не бился в догадках о причине падения.
Пробовал так, не ловит.
Код
C++ (Qt)
thread_object = new ...
try {
  thread_object->start();
} catch (const exception_object& e) {
  ...
}
 


Название: Re: Как поймать исключение?
Отправлено: kramer3d от Март 24, 2010, 07:17
Ловить, очевидно, нужно в самом методе run(), ведь у него собственный стек, отделенный от стека основного потока.


Название: Re: Как поймать исключение?
Отправлено: niXman от Март 24, 2010, 07:48
Цитировать
Ловить, очевидно, нужно в самом методе run(), ведь у него собственный стек, отделенный от стека основного потока.
это понятно.
но бустовые исключения межпоточные. если реализовать по аналогии поток на boost::thread, то межпоточность работает.
а вот с Qtешными потоками нет. наверное все же дело в том, что у Qtешных потоков есть свой цикл сообщений. или еще в чем-то..


Название: Re: Как поймать исключение?
Отправлено: BRE от Март 24, 2010, 08:12
Ее, очень нужно отобразить. Чтоб юзер не бился в догадках о причине падения.
Можно попробовать, при ошибке в run() - останавливать поток (т.е. выходить из рабочего цикла) и посылать сигнал о ошибке (в качестве аргумента использовать код или строку с описанием проблемы).
А в главном потоке, ловить этот сигнал и сообщать пользователю причины.


Название: Re: Как поймать исключение?
Отправлено: Rcus от Март 24, 2010, 08:20
В Qt уже есть поддержка передачи исключений между потоками выполнения, но не в QThread, а в QtConcurrent, \see QtConcurrent::Exception


Название: Re: Как поймать исключение?
Отправлено: kramer3d от Март 24, 2010, 11:45
но бустовые исключения межпоточные. если реализовать по аналогии поток на boost::thread, то межпоточность работает.
а вот с Qtешными потоками нет. наверное все же дело в том, что у Qtешных потоков есть свой цикл сообщений. или еще в чем-то..

Т.е. вы хотите сказать, что в бусте можно бросить исключение в одном потоке, а поймать в другом?


Название: Re: Как поймать исключение?
Отправлено: niXman от Март 24, 2010, 21:22
kramer3d, вы верно заметили, это я не правильно понял из бустовской документации.
просто в данный момент, задался целью, разобраться с boost.exceptions и применением оного к межпоточной обработке.
почитав по этому поводу, понял, что не все так просто.


Название: Re: Как поймать исключение?
Отправлено: niXman от Март 24, 2010, 21:24
Цитировать
но бустовые исключения межпоточные. если реализовать по аналогии поток на boost::thread, то межпоточность работает.
поторопился с выводами ::)