Russian Qt Forum
Ноябрь 27, 2024, 02:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как поймать исключение?  (Прочитано 4417 раз)
niXman
Гость
« : Март 24, 2010, 03:55 »

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

Ловить, очевидно, нужно в самом методе run(), ведь у него собственный стек, отделенный от стека основного потока.
Записан
niXman
Гость
« Ответ #2 : Март 24, 2010, 07:48 »

Цитировать
Ловить, очевидно, нужно в самом методе run(), ведь у него собственный стек, отделенный от стека основного потока.
это понятно.
но бустовые исключения межпоточные. если реализовать по аналогии поток на boost::thread, то межпоточность работает.
а вот с Qtешными потоками нет. наверное все же дело в том, что у Qtешных потоков есть свой цикл сообщений. или еще в чем-то..
Записан
BRE
Гость
« Ответ #3 : Март 24, 2010, 08:12 »

Ее, очень нужно отобразить. Чтоб юзер не бился в догадках о причине падения.
Можно попробовать, при ошибке в run() - останавливать поток (т.е. выходить из рабочего цикла) и посылать сигнал о ошибке (в качестве аргумента использовать код или строку с описанием проблемы).
А в главном потоке, ловить этот сигнал и сообщать пользователю причины.
Записан
Rcus
Гость
« Ответ #4 : Март 24, 2010, 08:20 »

В Qt уже есть поддержка передачи исключений между потоками выполнения, но не в QThread, а в QtConcurrent, \see QtConcurrent::Exception
Записан
kramer3d
Гость
« Ответ #5 : Март 24, 2010, 11:45 »

но бустовые исключения межпоточные. если реализовать по аналогии поток на boost::thread, то межпоточность работает.
а вот с Qtешными потоками нет. наверное все же дело в том, что у Qtешных потоков есть свой цикл сообщений. или еще в чем-то..

Т.е. вы хотите сказать, что в бусте можно бросить исключение в одном потоке, а поймать в другом?
Записан
niXman
Гость
« Ответ #6 : Март 24, 2010, 21:22 »

kramer3d, вы верно заметили, это я не правильно понял из бустовской документации.
просто в данный момент, задался целью, разобраться с boost.exceptions и применением оного к межпоточной обработке.
почитав по этому поводу, понял, что не все так просто.
Записан
niXman
Гость
« Ответ #7 : Март 24, 2010, 21:24 »

Цитировать
но бустовые исключения межпоточные. если реализовать по аналогии поток на boost::thread, то межпоточность работает.
поторопился с выводами Строит глазки
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.149 секунд. Запросов: 20.