Seite 1 von 1
Exception Handling
Verfasst: 21. Oktober 2010 14:56
von IcemanX
Hallo,
ich bin neu was Qt betrifft. Wie kann ich in Qt Exceptions handhaben?
Bin es von Borland C++ und Visual C++ gewohnt, dass ich ähnliches wie folgt machen kann:
Code: Alles auswählen
int main(int argc, char *argv[])
{
try{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}catch(...){
QMessageBox msgBox;
msgBox.setText("error");
msgBox.exec();
}
return -1;
}
//---------------------------------------
void MainWindow::on_pushButton_clicked()
{
throw new std::string("it's the end of the world!");
}
leider wird der ausgelöste throw in Qt nicht gecatched, sondern es kommt zu einem Visual C++ Runtime Lib Fehler.
Habe auch bereis in der *.pro Datei folgendes eingefügt:
Code: Alles auswählen
CONFIG += qt
CONFIG += warn_on
CONFIG += exceptions
CONFIG += debug
Leider ohne Erfolg.
Kann Qt keine Exceptions?
Besten Dank im Voraus.
Liebe Grüße
Ricardo Cescon
- Software Engineer -
Verfasst: 21. Oktober 2010 15:31
von Christian81
Exception Handling funktioniert genau wie in 'normalen' C++ Zwei Dinge sind aber zu beachten
1. Qt sollte mit exceptions compiliert sein (was per default der Fall sein dürfte)
2. Die Exception muss abgefangen werden bevor die Qt-Eventloop erreicht wird.
2. ist in Deinem Fall das Problem.
Verfasst: 21. Oktober 2010 15:33
von franzf
Qt verwendet selbst keine Exceptions. Es hindert dich aber auch nicht, selber mit Exceptions zu arbeiten. Was sagt denn die Meldung der C++-Runtime, die dir Windows um die Ohren wirft?
Was mir auffällt: Deine QApplication existiert nur lokal im try-Block. Im Catch-Block hast du damit keine QApplication mehr, weshalb es mindestens zu einer Fehlermeldung auf der Konsole kommt, ala "QWidget: Must construct a QApplication before a QPaintDevice". Dadurch wird auf alle Fälle verhindert, das die MessageBox aufpoppt.
Und schau dir mal die ganzen schönen statischen Funktionen QMessageBox an, erleichtern dir einiges und schauen auch noch schöner aus

Verfasst: 22. Oktober 2010 08:25
von IcemanX
Hallo,
danke erst mal an franzf und Christian81 für eure Antworten.
Die Visual C++ Fehlermeldung habe ich mal als Bild angehängt.
Habe auch mal die MessageBox auf statisch umgestellt, nun wirft diese mir auch nen Fehler
Konsole: Invalid parameter passed to C runtime function.
Code: Alles auswählen
QMessageBox::information(this,tr(""), tr("error"), QMessageBox::Ok, QMessageBox::NoButton);
Gibt es bei Qt irgend eine Möglichkeit direkt in der "main" eine globale Fehlerbehandlung aller try/catch zu machen, falls in der Anwendung ein unvorhergesehener Fehler kommt?
In Borland C++ habe ich das immer so gemacht:
Code: Alles auswählen
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try{
try
{
Application->Title = "XXXX";
Application->Initialize();
Application->CreateForm(__classid(TfrmMain), &frmMain);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
}
__finally
{
// finally
}
return 0;
}
Stelle ich mich wirklich mit Qt so an oder hatte ich einfach zu viel Kontakt zu Java

in der letzten Zeit?
Schon mal danke für eure Geduld.
Verfasst: 22. Oktober 2010 08:45
von Christian81
IcemanX hat geschrieben:
Gibt es bei Qt irgend eine Möglichkeit direkt in der "main" eine globale Fehlerbehandlung aller try/catch zu machen, falls in der Anwendung ein unvorhergesehener Fehler kommt?
Nein, siehe meine Antwort Nummer 2.
Gibt auch imho keinen Grund für.
Verfasst: 22. Oktober 2010 08:52
von chrislo1976
Hallo!
Bei mir funktioniert folgendes prinzipiell:
Code: Alles auswählen
try
{
return app.exec();
}
catch(...)
{
QMessageBox::critical(NULL, "Ausnahme", "Ausnahme aufgetreten!");
exit(1);
}
Allerdings musste ich dazu in VS2008 den Schalter /EHsc ausschalten, damit der catch-Block aufgerufen wird.
Ich würde im Fehlerfall dann noch gern weitere Informationen anzeigen.
Hauptziel ist aber den Bediener mit einem eigenen Dialog einen besseren Eindruck zu übermitteln, als mit dem Windows-Ausnahmedialog.
Dass eine Ausnahme gar nicht erst auftreten sollte ist klar, aber es kann halt trotzdem passieren...
Gruß,
Christian
Verfasst: 22. Oktober 2010 08:58
von RHBaum
wenn in den MsgHandlern ne exception geworfen wird ... sollt er die mit nem try Block um das QApplication::exec() schon fangen koennen fuer nen Globalen Exceptionhaendler, also theorethisch.
Setzt natuerlich vorraus, das die Qt auch in den MsgLoops Exceptionsicher und neutral ist. Die Frage ist also , ist sie das ?
Hab mich damit noch ned so beschaeftigt ...
Ciao ...
Verfasst: 22. Oktober 2010 10:00
von franzf
Verfasst: 22. Oktober 2010 12:09
von IcemanX
@chrislo1976:
und ohne VS2008, ich nehme direkt den Qt Creator!
Verfasst: 13. Dezember 2010 14:31
von Uncopy
Großartiger Fund! Danke

- Nun muss ich's aber erst mal lesen.
Ich dachte mir schon, dass exec und eigene Exceptions nicht so einfach harmonieren können.