2012-04-10 6 views
0

Kann mir jemand erklären, was tut die folgende „Debugger Fehlerbenachrichtigung“ bedeuten in C++ Builder XE:anwendungsdefinierte Ausnahme

"Project ... faulted with message: 'application-defined exception (code 0x0eefface) at 0x755ad36f. Process Stopped. Use Step or Run to continue." 

Es tritt nur auf, wenn ich eine Ausnahme werfen müssen - die Berufung des Wurfs wirft diesen Fehler auf. Ich kann keine Informationen zu diesem Problem finden.

Werfen der Ausnahme:

#define MY_ERROR_CODE 0xE0000046 

throw TMyTrouble(MY_ERROR_CODE, "My error message"); // calling of this raises the application-defined exception... 

Fang:

try{ 
Function(); // function that raises the exception TMyTrouble 
} 
catch(...){ // this catch should catch the exception but it doesn't 
// do something 
throw; // throw to upper layer 
} 

Definition von Ausnahme:

class TMyTrouble{ 
     public: 
     TMyTrouble(int errorCode = 0xFFFFFFFF, AnsiString errorMessage = "Unknown error") { FMessage = errorMessage; FCode = errorCode;} 
     __property AnsiString Message = {read = FMessage}; 
     __property unsigned long Code = {read = FCode}; 

     private: 
     unsigned long FCode; 
     AnsiString FMessage; 
    }; 
+0

Gibt es irgendwo einen "catch", der die ausgelöste Ausnahme behandelt? – hmjd

+0

ja, aber es fängt nichts - das ist was ist seltsam – Martinique

+1

Kannst du den 'throw' und den' catch' Code plus die Ausnahmedefinition posten? – hmjd

Antwort

0

Ist das nicht nur die Art und Weise des Debuggers zu sagen: „Ich habe gerade bemerkte eine Ausnahme wurde geworfen, was willst du tun? "

Wenn der Debugger nicht angehalten werden soll, wenn Sie eine Ausnahme auslösen, sind Einstellungen dafür vorhanden.

Wenn Sie contine wählen, sollte Ihr Code es dann fangen.

+0

wirft Ich glaube nicht ...Der Debugger informiert Sie darüber, wie Sie eine Ausnahme geworfen haben, aber das sieht nach einem internen Fehler des throw-Verfahrens aus, weil das Werfen nicht ausgeführt wird - es wird nicht eingefangen! Es sieht so aus, als ob die throw-Prozedur eine interne Ausnahme auslöst - aber es ist seltsam, weil es auch von der catch-Anweisung abgefangen werden sollte, aber es ist nicht ... :( – Martinique

+0

Nein, dies ist definitiv der Debugger, der eine erste Chance meldet Ausnahme, bevor die App es sieht.Dies wird durch diesen Text in der Nachricht angezeigt: "Prozess gestoppt. Verwenden Sie Schritt oder Ausführen, um fortzufahren." Dies ist völlig normales Verhalten.Tun was die Nachricht sagt. Drücken Sie F9, um die Ausführung fortzusetzen, und die Ausnahme wird an die App zur Behandlung weitergegeben –

1

Was Sie sehen, ist völlig normales Verhalten. Was Sie sehen, wird eine "erste Chance Ausnahme" -Nachricht genannt. Die Nachricht wird vom Debugger gemeldet, bevor die Ausnahme der Anwendung angezeigt wird. Dies wird durch den Text in der Nachricht offensichtlich: "Prozess gestoppt. Verwenden Sie Schritt oder Ausführen, um fortzufahren". Tun Sie einfach, was die Nachricht sagt - drücken Sie einfach F9, oder drücken Sie die Ausführen-Taste in der Symbolleiste, um die Ausführung fortzusetzen und die Ausnahme wird an die App zur normalen Behandlung in ihren try/catch Blöcken zurückgegeben.

+0

Warum wird es normalerweise nicht von der catch-Anweisung erfasst? Im Freigabemodus verursacht das Auslösen der Ausnahme, dass die Anwendung herunterfällt, was nicht normal ist, weil das Auslösen einer Ausnahme ohne catch-Anweisung verursacht ein Fehler-Dialog, aber nicht FALLING Down die Anwendung ... – Martinique

+0

Wenn ich F8 (Schritt vorwärts) drücken, nachdem die "erste Chance Ausnahme" Nachricht angezeigt wird, wie Sie sagten, dann wird meine Ausnahme nicht ausgeführt und die p rogram fährt damit fort, was nach der throw-aussage ist – Martinique

+0

'catch (...)' fängt nicht immer alles ein. Zum Beispiel, seit BCB6, VCL 'Exception' Objekte nicht korrekt gefangen. Versuchen Sie stattdessen, 'TMyTrouble' explizit einzufangen:' catch (const TMyTrouble & e) ' –

0

ich Ihnen allen entschuldigen, war Problem bei der Konstruktion vor der throw-Anweisung:

byte value; 
sscanf(buffer, "%02x", &value); 

Können Sie das Problem? Die sscanf Funktion gibt für diese Formatzeichenfolge "%02x" einen langen Wert (4 Bytes) zurück, aber ich habe eine Bytevariable value (1 Byte) - also 3 Bytes wurden irgendwo geschrieben und der Stapel wurde beschädigt (oder etwas), was meine Probleme verursacht ...

Vielen Dank für Ihre Hilfe