Wie wird der Fehler durch Division durch Null in Visual Studio 2008 C ++ erkannt?

7

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.

    
Joshua Fox 02.12.2009, 13:10
quelle

8 Antworten

7

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.

%Vor%

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.

    
Len Holgate 02.12.2009, 14:51
quelle
10

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: Ссылка

    
Volodymyr Frytskyy 22.11.2011 12:01
quelle
9

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.

    
Yuval Adam 02.12.2009 13:14
quelle
7

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.

    
Seb Rose 02.12.2009 13:13
quelle
4

Sie können das nicht mit Standard-C ++ tun, da es keine Standard-C ++ - Ausnahme ist. Es ist eine strukturierte Ausnahme. Für die Standard-C ++ - Ausnahme muss jemand eine throw exception; aus dem Code machen.

    
Naveen 02.12.2009 13:13
quelle
3

Warum nicht schon mal nachsehen? Die Leistung wird für eine einfache j == 0 im Vergleich zu Kontextwechsel für die Ausnahmebehandlung trivial.

    
Daniel A. White 02.12.2009 13:13
quelle
2

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.

    
Bill 02.12.2009 14:35
quelle
1

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

    
Georg Fritzsche 02.12.2009 14:46
quelle