J'utilise C# avec la bibliothèque XNA et je reçois NaNs surgissant dans mes objets Vector3. Existe-t-il un moyen d'entrer dans le débogueur lorsque le calcul incriminé se produit (par exemple une division par zéro)? Actuellement, le programme continue à fonctionner. J'utilise VS2008 Professional. Toutes les exceptions dans la boîte de dialogue Exceptions sont sélectionnées dans la colonne "user-unhandled". Edit: Pour clarifier, je ne peux pas savoir où est le mauvais calcul. C'est pourquoi je veux que le débogueur se casse automatiquement. La définition de points d'arrêt n'est pas une solution.Pause dans le débogueur C# pour diviser par zéro
Répondre
Tout d'abord divisant un double/flotteur par zéro donne Infinity/-Infinity selon si le double est positif ou négatif. Seul un double zéro/flottant divisé par zéro donne NaN. Dans les deux cas, aucune exception ne sera générée.
Vous devez pouvoir utiliser des points d'arrêt conditionnels pour détecter lorsqu'une variable particulière est définie sur l'une de ces valeurs. Soyez prudent lorsque vous vérifiez pour NaN si, comme 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
On dirait que vous gérez l'exception en quelque sorte (comme une capture d'une exception générique) Ce que vous pouvez faire est d'appuyer sur Ctrl + alt + E pour faire apparaître le dialogue des exceptions - assurez-vous de cocher la case "when thrown" pour l'exception (s) qui vous intéresse
Pas différent. Il continue juste à courir. –
Dans ce cas, qu'est-ce qui vous fait penser que l'exception est lancée? (mon défaut est d'arrêter de lancer des exceptions gérées pour couvrir toutes les éventualités). Les points d'arrêt conditionnels pourraient aussi aider. –
Eh bien peut-être que ce n'est pas jeté. Je souhaite que c'était. Puisque le calcul est presque certainement dans les fonctions membres Vector3 de la bibliothèque XNA, je n'ai aucun contrôle sur le fait de laisser des exceptions. Je m'attends à ce que "quand jeté" pour travailler là, cependant. –
vous pouvez définir une conditional breakpoint qui casse que lorsque le diviseur d'une expression est 0.
je sais que c'est un ancien poste mais .....
de l'expérience de ses presque toujours Vector3.Normalize que je l'utilise par erreur.
Quand je ne suis pas sûr que ce sera une longueur nulle maintenant je fais toujours
flotteur L = V.Length(); si (L! = 0,0) V/= L; Diviser par zéro dans Normalize devrait donner une exception, mais ce n'est pas le cas. Causé moi beaucoup de grattage de la tête.
Autant que je peux voir, les points d'arrêt conditionnels sont évalués à une ligne source particulière. Est-ce correct? Le problème est que je n'ai aucune idée d'où vient le NaN, c'est pourquoi je voudrais juste que le débogueur s'arrête quand ça arrive. –
Oui, vous devez définir le point d'arrêt sur une ligne de code. Cependant, vous devriez être en mesure d'affiner la source en ajoutant des points d'arrêt et en réexécutant le code. Initialement, je pensais que le mot-clé 'checked' aiderait, mais dans mes tests, ce n'est pas le cas. –
Oui, il semble que la spécification de point flottant IEEE. ne prévoit aucune exception pour cette situation. On dirait que je vais devoir le trouver à la dure. Merci. –