none
Exception Handler - Wer fängt meine c++ exception ? RRS feed

  • Frage

  • Hallo,

    innerhalb der OnPaint message hat mein Program eine Exception geworfen.

    throw GDictionaryElementNotFound();

    Ausser der Ausgabe im Output

    First-chance exception at 0x7554b727 in AppD.exe: Microsoft C++ exception: GDictionaryElementNotFound at memory location 0x0018ea27..

    bekam ich davon nichts mit. Nebeneffekt war ein nicht freigegeber Lock der dann zu einem Problem wurde :)

    Irgendetwas hat also die Exception abgefangen.

    Kann ich mir eine Liste der installierten Handler ausgeben lassen ?

    Kann ich das Programm einfach 'abstürzen' lassen ?

    Alex


    Grüße, Alexander Golde
    Freitag, 20. November 2009 12:09

Antworten

  • Von was ist diese Exception den abgeleitet?

    Grundsätzlich hat der Message Handler der MFC einen Exeption-Handler. Schau einfach mal in den Sourcecode der MFC.
    Es gibt eine Funktion AfxInternalProcessWndProcException die behandel MFC Ausnahmen in Fensterprozeduren.
    WM_PAINT wir dhier besonders behandelt.

    Siehe thrdcore.cpp und wincore.cpp  AfxCallWndProc.
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 20. November 2009 16:06
    Moderator
  • Nein! Man kann solche Handler nicht anzeigen.

    Aber Du kanst ja mal Deinen Catch Code durchsuchen.

    BTW: Im Debugger kannst Du im Debug Menu Exceptions so einstellen, dass sie sosofrt einen Break auslösen. Dann kannst Du debuggen wohin das Programm weiterläuft. Also die Exception Behandlung durch tracen.

    Ansonsten solltest Du vermeiden Exceptions durch die Handler von Windows hindurch zu werfen!
    Du solltest in jedem Fall hier einen eigenen Handler haben bevor Du allesduirch den Callstack von Windows hindurch zurück abspulen lässt. Manch ein Subclass Handler wird Dir das evtl. sehr übel nehmen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Samstag, 21. November 2009 07:39
    Moderator

Alle Antworten

  • Von was ist diese Exception den abgeleitet?

    Grundsätzlich hat der Message Handler der MFC einen Exeption-Handler. Schau einfach mal in den Sourcecode der MFC.
    Es gibt eine Funktion AfxInternalProcessWndProcException die behandel MFC Ausnahmen in Fensterprozeduren.
    WM_PAINT wir dhier besonders behandelt.

    Siehe thrdcore.cpp und wincore.cpp  AfxCallWndProc.
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 20. November 2009 16:06
    Moderator
  • Hallo,

    die Exception ist nicht abgeleitet :

    class GDictionaryElementNotFound
     {
     public:
      GDictionaryElementNotFound( const CString & element )
       {
       TRACE( _T("GDictionaryElementNotFound : %s\n"), element );
       };
     };

    Die AfxInternalProcessWndProcException wird nicht angesprungen.

    Ich werde mal den Call Stack runterwandern und per Breakpoint das Problem einzugrenzen.

    Aber eine Liste der Exception Handler kann mit das Studio nicht anzeigen, oder ?
    Wäre ja mal ein interessantes Feature.


    Grüße, Alexander Golde
    Freitag, 20. November 2009 20:48
  • Nein! Man kann solche Handler nicht anzeigen.

    Aber Du kanst ja mal Deinen Catch Code durchsuchen.

    BTW: Im Debugger kannst Du im Debug Menu Exceptions so einstellen, dass sie sosofrt einen Break auslösen. Dann kannst Du debuggen wohin das Programm weiterläuft. Also die Exception Behandlung durch tracen.

    Ansonsten solltest Du vermeiden Exceptions durch die Handler von Windows hindurch zu werfen!
    Du solltest in jedem Fall hier einen eigenen Handler haben bevor Du allesduirch den Callstack von Windows hindurch zurück abspulen lässt. Manch ein Subclass Handler wird Dir das evtl. sehr übel nehmen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Samstag, 21. November 2009 07:39
    Moderator
  • Hallo,

    >Ansonsten solltest Du vermeiden Exceptions durch die Handler von Windows hindurch zu werfen!
    >Du solltest in jedem Fall hier einen eigenen Handler haben bevor Du allesduirch den Callstack von Windows hindurch zurück abspulen lässt. Manch ein Subclass Handler wird Dir >das evtl. sehr übel nehmen

    So etwas tut man ja auch nicht :)

    In diesem speziellen Fall war's halt ein Bug :) Un noch dazu einer der (leider) nicht zum Totalabsturz geführt hat.

    Ich vermute mal eine Fremd - Dll die in meinen Prozess geladen wird und sich per Hook eingeklinkt hat.

    Grüße, Alexander Golde
    Montag, 23. November 2009 10:05