Umgang mit Exceptions ?
Verfasst: 15. März 2010 14:08
Hallo,
ich habe Probleme damit, wie Qt mit Fehlermeldungen und Ausnahmen umgeht.
Vor dem Umstieg von MFC auf Qt (z.Z. Qt 4.4.3, VS 2005, XP) habe ich
viel mit Exceptions (eigenen bzw. solchen aus Bibliotheken Dritter) gearbeitet
und möchte auch unter Qt den vollen Zugriff auf ihre Behandlung haben.
Zu den Problem im Detail:
Im Rahmen des Projekts existiert eine GUI-Applikation, bei deren Beendigung eine
Ausnahme angezeigt wird (MessageBox):
Im Debugger lässt sich ablesen, dass es sich um einen 'stack overflow' handelt,
der im Umfeld der unregister-Methoden aus der boost serialization Bibliothek erzeugt wird.
Solange ich die Ursache nicht beseitigen kann, möchte ich die MessageBox durch eine stream-Ausgabe ersetzen können.
Zur Behebung des Fehlers können später auch Informationen aus der Exception-Klasse genutzt werden.
Beides erfordert aber den Zugriff auf die Exception im catch-Zweig eines try-catch-Blocks.
Zur Zeit versuche ich auftretende Exceptions in der main-function und in der überschriebenen
QApplication::notify(..) Funktion zu behandeln.
Die Kapselung des message-loops /*1*/ machte aber erst in Verbindung mit
dem Überschreiben von QApplication::notify () /*2*/ einen Teil der Exceptions zugänglich.
Aber sowohl bei den Initialisierungen während des Progammstarts als auch beim Beenden
werden Exceptions von Qt-Messages überdeckt.
Somit habe ich - unter anderem - folgende Fragen:
- gibt es in Qt eine bessere Möglichkeit, auf die Exceptions zuzugreifen ?
- kann ich Qt daran hindern, Exceptions in wenig hilfreiche Messageboxes umzuwandeln ?
- Qt besitzt eine Vielzahl von Schaltern, wie QT_NO_STL, QT_NO_REGEXP, .., die an
keiner Stelle der Documentation zu finden waren. Sind darunter auch solche,
die Qt's Umgang mit Fehlermitteilungen steuern.
Vielen Dank im Voraus
bernds
ich habe Probleme damit, wie Qt mit Fehlermeldungen und Ausnahmen umgeht.
Vor dem Umstieg von MFC auf Qt (z.Z. Qt 4.4.3, VS 2005, XP) habe ich
viel mit Exceptions (eigenen bzw. solchen aus Bibliotheken Dritter) gearbeitet
und möchte auch unter Qt den vollen Zugriff auf ihre Behandlung haben.
Zu den Problem im Detail:
Im Rahmen des Projekts existiert eine GUI-Applikation, bei deren Beendigung eine
Ausnahme angezeigt wird (MessageBox):
Programm.exe - Fehler in der Anwendung
Die Ausnahme "unknown software exception"(0x...) ist ... an der Stelle 0x...
afgetreten. Klicken Sie af "OK", um das Programm zu beenden.
Im Debugger lässt sich ablesen, dass es sich um einen 'stack overflow' handelt,
der im Umfeld der unregister-Methoden aus der boost serialization Bibliothek erzeugt wird.
Solange ich die Ursache nicht beseitigen kann, möchte ich die MessageBox durch eine stream-Ausgabe ersetzen können.
Zur Behebung des Fehlers können später auch Informationen aus der Exception-Klasse genutzt werden.
Beides erfordert aber den Zugriff auf die Exception im catch-Zweig eines try-catch-Blocks.
Zur Zeit versuche ich auftretende Exceptions in der main-function und in der überschriebenen
QApplication::notify(..) Funktion zu behandeln.
Code: Alles auswählen
int main (int argc, char* argv[])
{
QString appName ("appName");
...
ApplicationEx a (argc, argv, appName);
AppParams ap (appName, ..);
MainWindow w (ap);
w.show();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
string mainName = "* " + appName.toStdString() + " main";
int retCode;
Application:
try {
retCode = a.exec(); /*1*/
}
catch (std::exception& e) {
cout << mainName << endl;
cout << "exception occurred : " << e.what() << endl;
goto Application; // restart application loop
}
...
catch (...) {
cout << mainName << endl;
string s ("unknown exception occurred");
cout << s << endl;
goto Application;
};
return retCode;
}
Code: Alles auswählen
bool ApplicationEx::notify (QObject* receiver, QEvent* event)
{
bool errRet = false;
bool tmp;
try {
tmp = QApplication::notify (receiver, event); /*2*/
}
...
catch (exception& e) {
cout << " * ApplicationEx::notify :" << endl;
cout << "exception occurred : " << e.what() << endl;
return errRet;
}
catch (...) {
...
string s ("unknown exception occurred");
clog << " * ApplicationEx::notify : " << s << endl;
cout << " * ApplicationEx::notify : " << s << endl;
return errRet;
};
return tmp;
}
dem Überschreiben von QApplication::notify () /*2*/ einen Teil der Exceptions zugänglich.
Aber sowohl bei den Initialisierungen während des Progammstarts als auch beim Beenden
werden Exceptions von Qt-Messages überdeckt.
Somit habe ich - unter anderem - folgende Fragen:
- gibt es in Qt eine bessere Möglichkeit, auf die Exceptions zuzugreifen ?
- kann ich Qt daran hindern, Exceptions in wenig hilfreiche Messageboxes umzuwandeln ?
- Qt besitzt eine Vielzahl von Schaltern, wie QT_NO_STL, QT_NO_REGEXP, .., die an
keiner Stelle der Documentation zu finden waren. Sind darunter auch solche,
die Qt's Umgang mit Fehlermitteilungen steuern.
Vielen Dank im Voraus
bernds