Tratamento de exceção elegante no OpenMP

O OpenMP proíbe o código que deixa o bloco openmp via exceção. Portanto, eu estou procurando uma boa maneira de obter as exceções de um bloco openmp com o propósito de relançá-lo no thread principal e lidar com um ponto posterior. Até agora, o melhor que consegui fazer é o seguinte:

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(); }
}

Enquanto isso funciona bem, relançando possíveis exceções da seção paralela assim que oThreadException objeto é destruído, esta construção ainda é um pouco difícil de usar com a colocação de umtry {}catch(...){} em torno de cada seção e ter que capturar manualmente a exceção.

Então, minha pergunta é: Alguém conhece uma maneira mais elegante (menos detalhada) de fazer isso (e, em caso afirmativo, como ela se parece)?

questionAnswers(1)

yourAnswerToTheQuestion