Anzeige:
Ergebnis 1 bis 13 von 13

Thema: C++ Exception

  1. #1
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128

    C++ Exception

    Hi,

    eigentlich sollte ja wenn die aufrufende Funktion kein catch Block besitzt die Excpetion weiterwerfen bis es zur main / os ankommt.

    Jetzt hab ich in der main Funktion ein try catch block der alles umschliesst aber ich fange nur die Funktionen auf die eine Ebene tiefer sind.
    Und Exceptions die noch tiefer im Program sind kommen nicht an es wird automatisch ein Backtrace von glibc ausgerichtet?!?!?
    Code:
    *** glibc detected *** ./prog: free(): invalid pointer: 0x08165c14 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb73878bd]
    /lib/tls/i686/cmov/libc.so.6(__libc_free+0x84)[0xb7387a44]
    /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7537fc1]
    /usr/lib/libQtGui.so.4(_ZN11QLayoutItemD0Ev+0x28)[0xb77ba9f8]
    /usr/lib/libQtGui.so.4(_ZN10QBoxLayoutD2Ev+0x89)[0xb779c8f9]
    /usr/lib/libQtGui.so.4(_ZN11QVBoxLayoutD1Ev+0x31)[0xb779c9d1]
    usw....
    b7eff000-b7f00000 rw-p b7eff000 00:00 0 
    b7f00000-b7f19000 r-xp 00000000 08:11 8433873    /lib/ld-2.4.so
    b7f19000-b7f1b000 rw-p 00018000 08:11 8433873    /lib/ld-2.4.so
    bf95f000-bf975000 rw-p bf95f000 00:00 0          [stack]
    ffffe000-fffff000 ---p 00000000 00:00 0          [vdso]
    Aborted (core dumped)
    Als Toolkit benutze ich Qt4 liegt es daran? ich meine wer fängt meine Exception ab? Nirgendswo anders habe ich ein try catch block ausser in der main funktion.

    Gruss,
    xmarvel

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.09.2005
    Beiträge
    66
    Die Exceptions die von der glibc geworfen werden haben nichts mit den C++-Exceptions zu tun. Auch wenn es theoretisch Möglichkeiten gibt das Signal abzufangen, ist die richtige Lösung den dahinterliegenden Programmfehler zu beseitigen. Ähnlich wie bei einem Segmentation Fault ist das Programm dann ohnehin in keinem Zustand in dem man noch etwas sinnvolles machen kann.

  3. #3
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128
    also die Exception löse ich ja zu testzwecken gewollt aus.
    Mir ist aufgefallen das ein Backtrace nur im Konstruktor erstellt wird (hab nicht dran gedacht das man dort keine Exception auslösen soll) aber wenn es eine normale Methode ist dann kommt nun folgendes:
    Code:
    terminate called after throwing an instance of 'AccessFailureException'
    Aborted (core dumped)
    *** Exited with status: 134 ***
    Also das wird auch nicht aufgefangen.

    /Edit
    ich glaub ich hab mein Problem gefunden siehe hier anscheinend funkt Qt tatsächlich dazwischen.

    Gruss,
    xmarvel
    Geändert von xmarvel (23-02-2007 um 13:11 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Jetzt hab ich in der main Funktion ein try catch block der alles umschliesst aber ich fange nur die Funktionen auf die eine Ebene tiefer sind.
    Und Exceptions die noch tiefer im Program sind kommen nicht an es wird automatisch ein Backtrace von glibc ausgerichtet?!?!?
    Dein Code, oder der einer von dir verwendeten Bibliothek hat möglicherweise irgendwo einen Fehler. Löst du in einem Qt Eventhandler oder Slot die Exception aus? Das wird von Qt nämlich nicht ohne weiteres unterstützt.

    Ein Tipp: Versuch doch mal mit Gdb (oder einem anderen Debugger) dein Programm anzuhalten wenn eine Aushnahme gefangen wird. Dann kannst du sehen, ob es irgendwo einen Catch-Block gibt, der die Weiterleitung verhindert.

    Mir ist aufgefallen das ein Backtrace nur im Konstruktor erstellt wird (hab nicht dran gedacht das man dort keine Exception auslösen soll) [...]
    Konstruktoren sind ein Beispiel für Stellen an denen man Exceptions werfen sollte. Das was du meinst, sind Destruktoren, oder?

  5. #5
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128
    Zitat Zitat von locus vivendi Beitrag anzeigen
    Dein Code, oder der einer von dir verwendeten Bibliothek hat möglicherweise irgendwo einen Fehler. Löst du in einem Qt Eventhandler oder Slot die Exception aus? Das wird von Qt nämlich nicht ohne weiteres unterstützt.
    ja daran liegt es jetzt definitiv siehe den Link vom editierten Beitrag.
    Jetzt bin ich auf der suche wo das erklärt wird auf der Qt Seite. Hat dazu jemand ein Link hab bis jetzt noch nichts gefunden auf trolltech.

    Zitat Zitat von locus vivendi Beitrag anzeigen
    Ein Tipp: Versuch doch mal mit Gdb (oder einem anderen Debugger) dein Programm anzuhalten wenn eine Aushnahme gefangen wird. Dann kannst du sehen, ob es irgendwo einen Catch-Block gibt, der die Weiterleitung verhindert.
    Das hab ich schon gemacht da wird allerdings wenn ich step by step gehe nur der Konstruktor von der Exception Klasse aufgerufen und anschließend wird das Programm terminiert.

    Zitat Zitat von locus vivendi Beitrag anzeigen
    Konstruktoren sind ein Beispiel für Stellen an denen man Exceptions werfen sollte. Das was du meinst, sind Destruktoren, oder?
    stimmt da hast du recht.

    Gruss,
    xmarvel

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Qt wird oft ohne Execption Support gebaut, weil es Qt selbst nicht benutzt und daher auch keine Aussage über das Verhalten der Software gemacht werden kann, wenn eine Exception Qt internen Code durchläuft (zB eine Signal/Slot Aktivierung)

    Hast du die Qt Lib selbst gebaut (mit Execptionsupport) oder eine vorbereitet benutzt?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128
    Zitat Zitat von anda_skoa Beitrag anzeigen
    Qt wird oft ohne Execption Support gebaut, weil es Qt selbst nicht benutzt und daher auch keine Aussage über das Verhalten der Software gemacht werden kann, wenn eine Exception Qt internen Code durchläuft (zB eine Signal/Slot Aktivierung)

    Hast du die Qt Lib selbst gebaut (mit Execptionsupport) oder eine vorbereitet benutzt?

    Ciao,
    _
    nein hab das ubuntu packet installiert Qt4.2 k.a. ob das mit oder ohne Exception Support gebaut wurde.
    Was passiert jetzt wenn mein Programm mit bzw. ohne Exception Support gebaut wird?
    Irgendwie fehlt mir noch der Hintergrund wie Qt mit Exceptions umgeht innerhalb von Slots und Events.
    Soll man jetzt eher vermeiden Exception zu benutzen wenn man Qt benutzt oder stellen sie sich das vor dauernd eventFilter zu installieren?

    Gruss,
    xmarvel

  8. #8
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Dein Code, oder der einer von dir verwendeten Bibliothek hat möglicherweise irgendwo einen Fehler. Löst du in einem Qt Eventhandler oder Slot die Exception aus? Das wird von Qt nämlich nicht ohne weiteres unterstützt.
    ja daran liegt es jetzt definitiv siehe den Link vom editierten Beitrag.
    Jetzt bin ich auf der suche wo das erklärt wird auf der Qt Seite. Hat dazu jemand ein Link hab bis jetzt noch nichts gefunden auf trolltech.
    In Trolltechs Bugtracker ist dazu ein Report: http://www.trolltech.com/developer/t...entry&id=88696
    Bitte beachte das es andere Verlautbarungen von Trolltech gibt die einem der Kommentare dort widersprechen. Und zwar dem von Marc Mutz, in dem er sagt das "Qt einfach nicht Exception-Sicher ist" (sinngemäß zitiert). U. a. Dimitri Sowieso von Trolltech z. B. sagt jedoch das man durchaus Exceptions mit Qt verwenden kann.

    Irgendwie fehlt mir noch der Hintergrund wie Qt mit Exceptions umgeht innerhalb von Slots und Events.
    Ich würde dazu raten, Exceptions nicht aus Qt Eventhandlern oder Slots herauszulassen. Oder du überschreibst QApplication::notify wie in der einen Meldung aus "Qtforum" angezeigt, und hoffst das dann alles funktionieren wird.

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von xmarvel Beitrag anzeigen
    nein hab das ubuntu packet installiert Qt4.2 k.a. ob das mit oder ohne Exception Support gebaut wurde.
    Vermutlich ohne, das ist die normale Vorgehensweise von Distributoren.

    Was passiert jetzt wenn mein Programm mit bzw. ohne Exception Support gebaut wird?
    Wenn dein Code ohne Exceptionsupport gebaut wird, kannst du keine Execptions benutzen.

    Irgendwie fehlt mir noch der Hintergrund wie Qt mit Exceptions umgeht innerhalb von Slots und Events.
    Qt unterstützt das nicht, d.h. das Verhalten ist nicht definiert

    Soll man jetzt eher vermeiden Exception zu benutzen wenn man Qt benutzt
    Nein, man kann über wo man eigene Code hat sehr wohl Exceptions benutzen, nur eben nicht "durch Qt hindurch".

    Zum Beispiel wenn du in einem Slot Code aufrufst, der Exceptions werfen kann, ist das kein Problem solange du alle Exceptions gefangen hast bevor der Slot in den Slotaufruf innerhalb von Qt zurückkehrt.

    Macht ohnehin keinen Sinn, weil die Signalquelle ja keinen Bezug zum Empfänger hat, also gar nicht sinnvoll darauf reagieren könnte.

    oder stellen sie sich das vor dauernd eventFilter zu installieren?
    Was haben EventFilter damit zu tun?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  10. #10
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128
    Zitat Zitat von locus vivendi
    In Trolltechs Bugtracker ist dazu ein Report: http://www.trolltech.com/developer/t...entry&id=88696
    danke für den Link.

    Zitat Zitat von anda_skoa Beitrag anzeigen
    Wenn dein Code ohne Exceptionsupport gebaut wird, kannst du keine Execptions benutzen.
    das verstehe ich nicht richtig wie kann Qt eigentlich die Exception abschalten? Ich meine das ist doch ein Sprachfeature von C++ direkt. Oder wirft Qt wenn es eingeschaltet ist selber Exception?

    Zitat Zitat von anda_skoa Beitrag anzeigen
    Nein, man kann über wo man eigene Code hat sehr wohl Exceptions benutzen, nur eben nicht "durch Qt hindurch".
    ok so werde ich das dann auch machen.

    Zitat Zitat von anda_skoa Beitrag anzeigen
    Was haben EventFilter damit zu tun?
    so wie im obigen Link sollte man ja Notify überschreiben bzw. die Events vorher Filtern und dadrin die Exception abfangen.

    Gruss,
    xmarvel

  11. #11
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von xmarvel Beitrag anzeigen
    das verstehe ich nicht richtig wie kann Qt eigentlich die Exception abschalten? Ich meine das ist doch ein Sprachfeature von C++ direkt.
    Kann es auch nicht, wie kommst du darauf?

    Oder wirft Qt wenn es eingeschaltet ist selber Exception?
    Nein, Qt benutzt keine Exceptions.

    so wie im obigen Link sollte man ja Notify überschreiben bzw. die Events vorher Filtern und dadrin die Exception abfangen.
    Das hat aber nichts mit EventFilter zu tun, sondern man muß, wie schon oben gesagt, dafür sorgen, daß alle Exceptions gefangen sind, bevor der Aufruf wieder in den Qt internen Code zurückkehrt.

    Ob der Aufruf eine Signal/Slot Verbindung ist, oder der Aufruf eine protected virtual Methode aus dem Code der Basisklasse heraus, oder der direkte Aufruf einer public virtual Methode spielt keine Rolle.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  12. #12
    Registrierter Benutzer
    Registriert seit
    31.08.2002
    Ort
    Berlin
    Beiträge
    128
    Zitat Zitat von anda_skoa Beitrag anzeigen
    Kann es auch nicht, wie kommst du darauf?
    wegen:
    Qt wird oft ohne Execption Support gebaut ... Hast du die Qt Lib selbst gebaut (mit Execptionsupport)
    was soll das bedeuten? Qt benutzt kein Exception aber man Qt mit Exception oder ohne bauen

    Gruss,
    xmarvel

  13. #13
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ja, da gibt es einen Compilerswitch dafür, also eine g++ Einstellung.

    Keine Ahnung ob das was ändert, aber im Falle einer Problemstellung gehe ich mal davon aus, daß man besser alle Möglichkeiten kennt, denn eventuell ist auch eine der weniger wahrscheinlichen Variante der Auslöser.

    Ich nehme an, der wesentliche Unterschied wird sein, ob ein "new" in Qt bei Speichermangel eine Exception wirft, oder gleich das Programm abbricht.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •