Exception Handling

Verschiedenes zu Qt
Antworten
IcemanX
Beiträge: 3
Registriert: 20. Oktober 2010 09:11
Kontaktdaten:

Exception Handling

Beitrag 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? :cry:



Besten Dank im Voraus.


Liebe Grüße
Ricardo Cescon

- Software Engineer -
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 :)
IcemanX
Beiträge: 3
Registriert: 20. Oktober 2010 09:11
Kontaktdaten:

Beitrag 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 :cry:
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 :evil: in der letzten Zeit?

Schon mal danke für eure Geduld.
Dateianhänge
Visual C++ Runtime Lib. Error
Visual C++ Runtime Lib. Error
Unbenannt.jpg (27.22 KiB) 9454 mal betrachtet
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Beitrag 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
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

IcemanX
Beiträge: 3
Registriert: 20. Oktober 2010 09:11
Kontaktdaten:

Beitrag von IcemanX »

@chrislo1976:

und ohne VS2008, ich nehme direkt den Qt Creator!
Uncopy
Beiträge: 20
Registriert: 26. August 2010 16:20
Wohnort: Berlin

Beitrag von Uncopy »

franzf hat geschrieben:http://rohieb.wordpress.com/2010/07/08/ ... and-slots/
Und es funktioniert :P
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.
Antworten