Элегантная обработка исключений в OpenMP

OpenMP запрещает код, который покидает блок openmp через исключение. Поэтому я ищу хороший способ получения исключений из блока openmp с целью переброски его в основной поток и обработки на более позднем этапе. На данный момент лучшее, что я смог придумать, это следующее:

class ThreadException {
    std::exception_ptr Ptr;
    std::mutex         Lock;
public:
    ThreadException(): Ptr(nullptr) {}
    ~ThreadException(){ this->Rethrow(); }  
    void Rethrow(){
        if(this->Ptr) std::rethrow_exception(this->Ptr);
    }
    void CaptureException() { 
        std::unique_lock<std::mutex> guard(this->Lock);
        this->Ptr = std::current_exception(); 
    }   
};
//...
ThreadException except;
#pragma omp parallel
{
    try {
      //some possibly throwing code
    } 
    catch(...) { except.CaptureException(); }
}

Хотя это работает хорошо, перебрасывание возможных исключений из параллельного раздела, как толькоThreadException объект разрушен, эта конструкция все еще немного неудобна для использованияtry {}catch(...){} вокруг каждого раздела и необходимости вручную захватить исключение.

Итак, мой вопрос: кто-нибудь знает более элегантный (менее многословный) способ сделать это (и если да, то как это выглядит)?

Ответы на вопрос(1)

Ваш ответ на вопрос