Хотя этот вопрос не ограничивается библиотеками OpenKinect, это лучший пример, который я мог бы привести для демонстрации этого.
В оболочке C ++ для 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;
}
Мой вопрос прост: можно ли как-то отловить эти ошибки и обработать их?
Обычно я бы обрабатывал исключения или переписывал код: мне не нравится, когда программы вызывают сбой из-за исключений, я бы предпочел обрабатывать их чисто, если я знаю, что они могут произойти. Есть некоторые библиотеки, которые делают подобные вещи, которые я не могу переписать, поэтому я и решил задать этот вопрос.
Вы должны более четко определить, каковы обязанности потока. Я предполагаю, что это передает некоторые сообщения некоторым другим потокам, через какую-то трубу или параллельную очередь. В этом случае просто измените ваш класс сообщений для хранения информации об исключении (std :: exception_ptr). Когда вы получаете доступ к данным в сообщении, сначала проверьте, содержит ли исключение; если это так, вызовите std :: rethrow_exception ().
Аналогичный механизм используется в std :: future (); либо вы получаете () из него обещанное значение, либо при попытке сделать это возникает исключение, полученное из другого потока. Найдите примеры std :: async (), чтобы увидеть его в действии.
Других решений пока нет …