2010-12-15 88 views
3

J'utilise boost :: date_time dans mon projet. Lorsque la date n'est pas valide, elle étend l'exception C++ std :: out_of_range. Dans l'application gui de Qt sur la plate-forme Windows, elle devient une exception SEH, elle n'est donc pas prise en compte avec le paradigme try | catch et les matrices de programmation. Comment puis-je attraper la plate-forme d'exception indépendamment?Comment attraper des exceptions avec la plate-forme Qt indépendamment?

try{ 
    std::string ts("9999-99-99 99:99:99.999"); 
    ptime t(time_from_string(ts)) 
} 
catch(...) 
{ 
    // doesn't work on windows 
} 

ÉDITÉE: Si quelqu'un ne comprend pas, j'ai écrit un autre exemple:

Qt fichier pro:

TEMPLATE = app 
DESTDIR = bin 
VERSION = 1.0.0 
CONFIG += debug_and_release build_all 
TARGET = QExceptExample 
SOURCES += exceptexample.cpp \ 
      main.cpp 
HEADERS += exceptexample.h 

exceptexample.h

#ifndef __EXCEPTEXAMPLE_H__ 
#define __EXCEPTEXAMPLE_H__ 

#include <QtGui/QMainWindow> 
#include <QtGui/QMessageBox> 
#include <QtGui/QPushButton> 
#include <stdexcept> 

class PushButton; 
class QMessageBox; 

class ExceptExample : public QMainWindow 
{ 
    Q_OBJECT 
    public: 
    ExceptExample(); 
    ~ExceptExample(); 
    public slots: 
    void throwExcept(); 
    private: 
    QPushButton * throwBtn; 
}; 

#endif 

exceptexample.cpp

#include "exceptexample.h" 

ExceptExample::ExceptExample() 
{ 
    throwBtn = new QPushButton(this); 
    connect(throwBtn, SIGNAL(clicked()), this, SLOT(throwExcept())); 
} 

ExceptExample::~ExceptExample() 
{ 
} 

void ExceptExample::throwExcept() 
{ 
    QMessageBox::information(this, "info", "We are in throwExcept()", 
          QMessageBox::Ok); 
    try{ 
    throw std::out_of_range("ExceptExample"); 
    } 
    catch(...){ 
    QMessageBox::information(this, "hidden", "Windows users can't see " 
          "this message", QMessageBox::Ok); 
    } 
} 

main.cpp

#include "exceptexample.h" 
#include <QApplication> 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 
    ExceptExample e; 
    e.show(); 
    return app.exec(); 
} 
+0

Qu'est-ce que cela a à voir avec Qt? Vous n'utilisez aucune classe Qt dans votre code. –

+0

L'erreur est réelle dans Qt. Ce code fonctionne bien sauf Qt-windows-gui, car, je pense, il relance les exceptions C++ std comme SEH, donc l'application tombe (catch ne fonctionne pas). – hoxnox

+0

Je ne vois pas non plus comment cela a à voir avec Qt. Vous avez un code local non-Qt qui lance une exception, et un try catch-block autour de cela. Aussi attraper (...) devrait tout attraper. Le seul problème avec Qt serait que l'exception se retrouve dans la boucle d'événements Qt, ce qui n'est pas le cas ici. Et qu'est-ce que SEH? –

Répondre

4

Ajout réponse des commentaires:

aschelper a écrit:

Votre bibliothèque Qt est-elle compilée avec le support d'exception C++ activé? Parfois, ils ne le sont pas, ce qui cause des problèmes.

hoxnox (OP) ont répondu:

@aschelper Je reconfiguré Qt avec option de -exceptions. Il a fixé la situation. Si vous postez la réponse je vais le marquer comme bon.