Elegante Ausnahmebehandlung in OpenMP

OpenMP verbietet Code, der den openmp-Block über eine Ausnahme verlässt. Daher suche ich nach einer guten Möglichkeit, die Ausnahmen von einem openmp-Block zu erhalten, um sie im Haupt-Thread erneut zu werfen und zu einem späteren Zeitpunkt zu verarbeiten. Bisher ist das Beste, was ich mir einfallen lassen konnte, das Folgende:

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

Dies funktioniert zwar gut, wirft jedoch mögliche Ausnahmen aus dem parallelen Abschnitt zurück, sobald dieThreadException Objekt zerstört ist, ist dieses Konstrukt noch ein bisschen unhandlich mit Putting a zu verwendentry {}catch(...){} um jeden Abschnitt und müssen die Ausnahme manuell erfassen.

Meine Frage lautet also: Kennt jemand eine elegantere (weniger ausführliche) Methode, um dies zu tun (und wenn ja, wie sieht sie aus)?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage