Ich habe eine C++ DLL mit Code wie folgt:Ist es für einen Bibliotheksbenutzer möglich, C++ - Ausnahmen zu umgehen?
LogMessage("Hello world");
try {
throw new int;
} catch(int* e) {
LogMessage("Caught exception");
delete e;
}
LogMessage("Done");
Diese DLL durch eine Drittanbieter-Anwendung geladen wird und der Code oben aufgerufen wird. Das Problem ist nur das erste LogMessage
wird aufgerufen - obwohl es einen Ausnahme-Handler gibt, wird der Kontrollfluss zum Unbekannten übertragen.
Ich sehe das und kann mich nicht entscheiden, ob es sich um einen obskuren Bug handelt oder nur um die böse Kraft der Verbraucheranwendung.
Ist es wirklich möglich, dass eine Benutzeranwendung die C++ - Ausnahmebehandlung in einer DLL überschreibt?
EDIT: Das Problem gelöst nach dem Nachdenken über alle Dinge zu überprüfen in den Antworten skizziert. In echtem Code ist es nicht nur werfen, gibt es eine spezielle Funktion zum Auslösen von Ausnahmen, die einen Aufruf von MessageBoxW() Win32 Aufruf in der Debug-Version hat. Und die Verbraucheranwendung hatte Schwierigkeiten, die Nachrichtenbox zu zeigen (es ist ein NT-Dienst) und sie hat tatsächlich aufgelegt. Es ist also kein Problem der C++ - Ausnahmen in irgendeiner Weise.
Ich akzeptiere diese Antwort, weil sie die umfangreichste Liste von Dingen bietet, die man beim Debuggen solcher Probleme überprüfen kann. – sharptooth