2016-12-02 5 views
1

ich eine Unterklasse von QException gemacht wie folgt:Qt QException Unterklasse geworfen, aber QUnhandledException gefangen

#include <QtConcurrent> 
#include <QException> 

class ProcessingException : public QException 
{ 
public: 
    ProcessingException(QString const& message) : 
     message(message) 
    {} 

    virtual ~ProcessingException() 
    { 

    } 

    void raise() const { throw *this; } 
    ProcessingException *clone() const { return new ProcessingException(*this); } 

    QString getMessage() const 
    { 
     return message; 
    } 
private: 
    QString message; 
}; 

Von einer Methode, die von QtConcurrent laufen gelassen :: run ich eine Instanz dieser Unterklasse mit throw new ProcessingException("test"); werfen. Dann, wenn ich die Dokumentation richtig verstehe, wenn ich das Ergebnis der Zukunft mit .waitForFinished() sammeln, sollte Qt die QException-Unterklasse erneut werfen. Mit diesem Ansatz kann ich jedoch nur eine QUnhandledException abfangen:

try 
{ 
    watcher->waitForFinished(); 
} 
catch(const ProcessingException &e) 
{ 
    qCritical() << "Caught:" << e.getMessage(); 
} 
catch(const QUnhandledException &e) 
{ 
    qCritical() << "Uncaught qexception!"; 
} 

Was fehlt mir?

Antwort

3

Sie einen Zeiger zu werfen, sondern eine Referenz ....

Gerade throw ProcessingException("test"); zu kontrollieren. Sie können es durch const Referenz abfangen und Sie müssen nicht aufräumen (rufen Sie delete) nach dem Abfangen.

Bezug: throw new std::exception vs throw std::exception

Verwandte Themen