Frage

In Visual C ++ 2008 möchte ich eine Ausnahme "abfangen", die wie hier gezeigt generiert wurde:

try {
    int foo = 20;
    ::fgetpos(0, (fpos_t*)&foo);
}
//...

Hier sind Anpassungen, die ich vorgenommen habe, um einen erfolgreichen Fang zu versuchen:

  1. SEH ist aktiviert (/eha)
  2. Ich habe einen Haken hinzugefügt (...)
  3. Ich habe eine hinzugefügt _set_se_übersetzer Vektor.
  4. Ich habe die SEH-Syntax hinzugefügt / angepasst:__versuch / __Ausnahme (EXCEPTION_EXECUTE_HANDLER)

Kurz gesagt, ich habe "alles im Buch" ausprobiert und kann die Ausnahme immer noch nicht erkennen.Wenn ich den Anruf ersetze an ::fgetpos mit int hey = foo / 0 dann funktionieren plötzlich alle oben genannten Techniken wie erwartet.Also die Ausnahme, mit der ich es zu tun habe ::fgetpos ist irgendwie "extra speziell."

Kann jemand erklären, warum dieser :: fgetpos-Fehler nicht auffindbar zu sein scheint und wie man ihn umgehen kann?

Update Bei Ausführung in der VS-IDE nennt das Ausgabefenster keine Ausnahme.Alles was es sagt ist das:

Die Microsoft Visual Studio C-Laufzeitbibliothek hat einen schwerwiegenden Fehler in meinem Programm festgestellt.exe.

Nicht sehr hilfreich.Wenn ich die Konsolen-App über die Befehlszeile starte, wird ein Absturzdialog angezeigt.Der Abschnitt "Problemdetails" des Dialogs enthält diese Informationen:

Name des Problemereignisses:BEX
Ausnahme-Offset: 0002fd30
Ausnahmecode:artikelnummer: c0000417
Ausnahmedaten:00000000
Zusätzliche Informationen 1:69ad
Zusätzliche Informationen 2:69addfb19767b2221c8e3e7a5cd2f4ae
Zusätzliche Informationen 3: b1ff
Zusätzliche Informationen 4: b1ffca30cadddc78c19f19b6d150997f

War es hilfreich?

Lösung

Da der Code in Ihrem Dump entspricht STATUS_INVALID_CRUNTIME_PARAMETER, versuchen _set_invalid_parameter_handler

Andere Tipps

Höchstwahrscheinlich fängt die Laufzeit es für Sie ab und gibt einen Debug-Dialog aus, ohne die Ausnahme zurückzugeben oder weiterzugeben - das ist ein CRT-Aufruf, und sie können dort beliebigen Code zum Abfangen von Ausnahmen hinzufügen.Es liegt im Rahmen der Rechte von Visual Studio, eine Hardwareausnahme innerhalb einer Bibliotheksfunktion abzufangen, besonders wenn Sie innerhalb der IDE oder im Debug-Modus ausgeführt werden, ist dies der Fall erwartenden der Laufzeit.

Wenn Sie durch Null dividieren, gibt es hier natürlich keinen Bibliotheksaufruf, um diesen zusätzlichen Fangcode zu schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top