Wie kann ich einen Divide-by-Zero-Fehler (und keine anderen Fehler und in der Lage sein, auf Ausnahmebedingungsinformationen zuzugreifen) in Visual Studio 2008 C ++ abfangen?
Ich habe es versucht:
%Vor%Aber das geht zum generischen ... catch-Block. Ich verstehe, dass die MS-spezifische __try irgendwie hier nützlich sein kann, aber ich würde Standard C ++ bevorzugen, und in jedem Fall habe ich Destruktoren, die die Verwendung von __try verhindern.
Erläuterung: Der obige Code ist für Diskussionszwecke vereinfacht. Tatsächlich ist die Division durch Null ein Fehler, der tief in einer DLL von Drittanbietern auftritt, für die ich den Quellcode nicht habe. Der Fehler hängt vom Parameter ab (einem Handle für eine komplexe Struktur), den ich an die Bibliothek übergebe, aber nicht auf eine naheliegende Weise. Also, ich möchte in der Lage sein, mich elegant zu erholen.
Angenommen, Sie können die Ursache des ausnahmegenerierenden Codes nicht einfach beheben (vielleicht, weil Sie den Quellcode für diese bestimmte Bibliothek nicht haben und vielleicht weil Sie die Eingabeparameter nicht anpassen können, bevor sie ein Problem verursachen) .
Du musst durch einige Ringe springen, damit das funktioniert, wie du willst, aber es kann gemacht werden.
Zuerst müssen Sie eine strukturierte Ausnahmebehandlung-Übersetzungsfunktion installieren, indem Sie _set_se_translator()
aufrufen (siehe hier ), dann können Sie den Code untersuchen, den Sie übergeben haben, wenn eine SEH-Ausnahme auftritt, und eine entsprechende C ++ - Ausnahme auslösen.
Dann können Sie einfach Ihre CMyFunkyDivideByZeroException()
in C ++ auf normale Weise abfangen.
Beachten Sie, dass Sie die Ausnahmeübersetzungsfunktion für jeden Thread installieren müssen, für den Ausnahmen übersetzt werden sollen.
Um Exceptions von Divisionen durch Null in Visual C ++ zu fangen, versuchen Sie in den Projekteinstellungen nur die Option / EHa zu aktivieren (try- & gt; catch (...)). Siehe Projekteigenschaften - & gt; C / C ++ - & gt; Codegenerierung - & gt; Ändern Sie die C ++ - Ausnahmen aktivieren zu "Ja mit SEH-Ausnahmen" . Das ist es!
Siehe Details hier: Ссылка
C ++ behandelt per Division keine Division durch Null als Ausnahme.
Zitat von Stroustrup:
"Low-Level-Ereignisse, wie z. B. Arithmetik Überläufe und dividieren durch Null, sind vermutlich von einem dedizierten behandelt werden Mechanismus auf niedrigerer Ebene statt durch Ausnahmen. Dies ermöglicht C ++ die Übereinstimmung das Verhalten anderer Sprachen wann es kommt zur Arithmetik. Es vermeidet auch die Probleme, die auf stark auftreten Pipeline-Architekturen mit Ereignissen wie z. B. durch Null teilen sind asynchron. "
"Das Design und die Evolution von C ++" (Addison Wesley, 1994)
In jedem Fall sind Ausnahmen nie ein Ersatz für die richtige Behandlung von Vorbedingungen.
Sie können entweder eine strukturierte Ausnahmebehandlung verwenden (mit __try usw.) oder Sie können einen strukturierten Exception-Handler-Übersetzer installieren: _ set_se_translator
Beide sind betriebssystemspezifisch.
Warum nicht schon mal nachsehen? Die Leistung wird für eine einfache j == 0
im Vergleich zu Kontextwechsel für die Ausnahmebehandlung trivial.
Probieren Sie den folgenden Code:
%Vor%Wenn Sie das ohne Ausnahmen machen, können Sie natürlich Folgendes tun:
%Vor%Bearbeiten Sie als Antwort auf die Klärung: Sie müssen herausfinden, welche Eingabe es ist, dass Sie die dritte Partei übergeben, die bewirkt, dass sie vorher durch Null dividieren, und behandeln, bevor Sie ihre Funktion aufrufen.
Ein guter Ansatz wäre die Verwendung sicherer objektorientierter Wrapper wie SafeInt . Es scheint auch in Visual Studio 2010 integriert zu sein .
> Aktualisierung:
Wenn die Division durch Null im Code von Drittanbietern geschieht, ist Ihre einzige Option SEH oder etwas Ähnliches wie beantwortet von Seb Rose
Tags und Links c++ exception-handling visual-studio-2008 try-catch