Elegancki wyjątek w OpenMP

OpenMP zabrania kodu, który pozostawia blok openmp za pomocą wyjątku. Dlatego szukam miłego sposobu na uzyskanie wyjątków z bloku openmp w celu ponownego wprowadzenia go do głównego wątku i obsługi w późniejszym czasie. Jak dotąd najlepsze, co mogłem wymyślić, to:

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

Podczas gdy działa to dobrze, ponownie rzucając możliwe wyjątki z sekcji równoległej, gdy tylkoThreadException obiekt jest zniszczony, konstrukcja ta jest jeszcze trochę niewygodna w użyciu przy wstawianiutry {}catch(...){} wokół każdej sekcji i konieczności ręcznego przechwycenia wyjątku.

Więc moje pytanie brzmi: czy ktoś zna bardziej elegancki (mniej gadatliwy) sposób na zrobienie tego (a jeśli tak, jak to wygląda)?

questionAnswers(1)

yourAnswerToTheQuestion