2009-03-31 9 views
3

Ich verwende C# mit der XNA-Bibliothek und ich bekomme NaNs in meine Vector3-Objekte. Gibt es eine Möglichkeit, in den Debugger einzubrechen, wenn die fehlerhafte Berechnung stattfindet (z. B. eine Division durch Null)? Derzeit läuft das Programm einfach weiter. Ich benutze VS2008 Professional. Alle Ausnahmen im Dialogfeld Ausnahmen werden in der Spalte "Benutzer nicht behandelt" ausgewählt.Brechen Sie in C# -Debugger für Division durch Null

Edit: Um zu klären, kann ich nicht herausfinden, wo die schlechte Berechnung ist. Deshalb möchte ich, dass der Debugger automatisch bricht. Breakpoints setzen ist keine Lösung.

Antwort

4

zum einen ist durch Null ein Doppel/float Teilung gibt Unendlichkeit/-Infinity abhängig ob das Doppelte positiv oder negativ ist. Nur ein Nulldoppel/Float geteilt durch Null ergibt NaN. In beiden Fällen wird keine Ausnahme ausgelöst.

Sie sollten bedingte Haltepunkte verwenden können, um festzustellen, wann eine bestimmte Variable auf einen dieser Werte gesetzt wird. Seien Sie vorsichtig, wenn Sie nach NaN suchen, wie NaN! = NaN.

double a = double.NaN; 
Console.Out.WriteLine(a == double.NaN); // false 
Console.Out.WriteLine(a == a); // false 
Console.Out.WriteLine(double.IsNaN(a)); // true 
+0

Soweit ich sehen kann, werden bedingte Breakpoints bei einer bestimmten Quellzeile ausgewertet. Ist das richtig? Das Problem ist, dass ich keine Ahnung habe, woher das NaN kommt, weshalb ich möchte, dass der Debugger aufhört, wenn es passiert. –

+0

Ja, Sie müssen den Haltepunkt in einer Codezeile festlegen. Sie sollten jedoch in der Lage sein, die Quelle nachzuvollziehen, indem Sie Haltepunkte hinzufügen und den Code erneut ausführen. Anfangs dachte ich, das 'checked' Schlüsselwort würde helfen, aber in meinen Tests nicht. –

+0

Ja, es scheint, dass die IEEE-Gleitkomma-Spezifikation. mandates keine Ausnahmen für diese Situation. Sieht so aus, als müsste ich es auf die harte Tour finden. Vielen Dank. –

4

Klingt, als ob Sie die Ausnahme irgendwie behandeln (wie eine generische Exception fangen). Sie können Strg + Alt + E drücken, um das Exceptions-Dialogfeld aufzurufen - stellen Sie sicher, dass das Kontrollkästchen "Wenn geworfen" aktiviert ist für die Ausnahme (n) in

+0

Nicht anders. Es läuft einfach weiter. –

+0

In diesem Fall - was lässt Sie denken, dass die Ausnahme geworfen wird? (Mein Standard ist es, alle verwalteten Ausnahmen zu stoppen, um eventuelle Eventualitäten abzudecken). Bedingte Haltepunkte könnten auch helfen –

+0

Nun, vielleicht wird es nicht geworfen. Ich wünschte es wäre. Da die Berechnung mit ziemlicher Sicherheit in den Vector3-Member-Funktionen der XNA-Bibliothek erfolgt, habe ich keine Kontrolle darüber, ob Ausnahmen zugelassen werden. Ich würde allerdings erwarten, dass "wenn geworfen" dort arbeiten wird. –

3

interessieren könnte Sie eine conditional breakpoint gesetzt, die nur bricht, wenn der Divisor eines Ausdrucks 0

1

Ich weiß, das ist eine alte Post, aber .....

aus Erfahrung seines fast immer Vector3.Normalize, dass ich versehentlich verwenden.

Wenn ich nicht sicher bin, ob es Null lang sein werde ich jetzt immer tun

Schwimmer L = V.Length(); if (L! = 0.0) V/= L;

Division durch Null in Normalize sollte eine Ausnahme geben, aber es nicht. Hat mir viel Kopfschütteln verursacht.