Хотя этот вопрос не ограничивается библиотеками OpenKinect, это лучший пример, который я мог бы предложить, чтобы показать это.Ловля исключений с Pthreads
В C++ Wrapper для OpenKinect, всякий раз, когда что-то идет не так, он выдает исключение runtime_error. Этот пример приведен из libfreenect.hpp. Нить создается в конструкторе класса.
// Do not call directly, thread runs here
void operator()() {
while(!m_stop) {
if(freenect_process_events(m_ctx) < 0) throw std::runtime_error("Cannot process freenect events");
}
}
static void *pthread_callback(void *user_data) {
Freenect* freenect = static_cast<Freenect*>(user_data);
(*freenect)();
return NULL;
}
Мой вопрос просто: можно ли как-то поймать эти ошибки и обработать их?
Как правило, я бы справился с исключениями или переписал код: мне не нравится, когда программы сбой из-за исключений, я бы лучше их обработал, если бы знал, что это возможно для них. Есть несколько библиотек, которые делают подобные вещи, которые я не могу переписать, поэтому почему я пришел, чтобы задать этот вопрос.
Почему вы не можете обрабатывать исключения? Почему бы не попробовать/поймать «(* freenect)(); вызов? –
Все дело в том, что это часть библиотеки. Хотя этот является открытым исходным кодом и может быть изменен, есть и другие ситуации, которые я не могу изменить. Поэтому я просто хотел узнать, можно ли бросить вызов из другого потока, используя pthreads. – AdmiralJonB
Не напрямую, нет. Исключения представляют собой механизм, основанный на стеках, и поэтому зависят от потока. Если вы не поймаете их в pthreads, потоки будут закрыты молча. Для передачи исключений из других потоков потребуются межпоточные коммиты в catch {}; –