Les livres de programmation de début incluent généralement cet avertissement: "Ne divisez pas par zéro! Vous obtiendrez une erreur d'exécution! "
Les choses ont changé en VB.NET. Bien qu'il y ait plus programmation et le calcul est plus précis, il n'est pas toujours facile de voir pourquoi les choses se passent comme elles le font.
Ici, nous apprenons à gérer la division par zéro en utilisant la gestion des erreurs structurée de VB.NET. Et en cours de route, nous couvrons également les nouvelles constantes VB.NET: NaN, Infinity et Epsilon.
Que se passe-t-il si vous exécutez «Diviser par zéro» dans VB.NET
Si vous exécutez un scénario de «division par zéro» dans VB.NET, vous obtenez ce résultat:
Dim a, b, c Comme double
a = 1: b = 0
c = a / b
Console. WriteLine (_
"Avoir des règles mathématiques" _
& vbCrLf & _
"été abrogé?" _
& vbCrLf & _
"Division par zéro " _
& vbCrLf & _
"doit être possible!")
Alors qu'est-ce qui se passe ici? La réponse est que VB.NET vous donne en fait la réponse mathématiquement correcte. Mathématiquement, vous
pouvez divisez par zéro, mais ce que vous obtenez est "l'infini".Dim a, b, c Comme double
a = 1: b = 0
c = a / b
Console. WriteLine (_
"La réponse est: " _
& c)
«Affiche:
«La réponse est: l'infini
La valeur "infini" n'est pas trop utile pour la plupart des applications d'entreprise. (À moins que le PDG ne se demande quelle est la limite supérieure de son bonus de stock.) Mais cela empêche vos applications de se bloquer sur une exception d'exécution comme le font les langages moins puissants.
VB.NET vous offre encore plus de flexibilité en vous permettant même d'effectuer des calculs. Regarde ça:
Dim a, b, c Comme double
a = 1: b = 0
c = a / b
c = c + 1
«Infinity plus 1 est
'toujours à l'infini
Pour rester mathématiquement correct, VB.NET vous donne la réponse NaN (Not a Number) pour certains calculs tels que 0/0.
Dim a, b, c Comme double
a = 0: b = 0
c = a / b
Console. WriteLine (_
"La réponse est: " _
& c)
«Affiche:
«La réponse est: NaN
VB.NET peut également faire la différence entre l'infini positif et l'infini négatif:
Dim a1, a2, b, c As Double
a1 = 1: a2 = -1: b = 0
Si (a1 / b)> (a2 / b) Alors _
Console. WriteLine (_
"L'infini positif est" _
& vbCrLf & _
"plus grand que" _
& vbCrLf & _
"infini négatif.")
En plus de PositiveInfinity et NegativeInfinity, VB.NET fournit également Epsilon, la plus petite valeur Double positive supérieure à zéro.
Gardez à l'esprit que toutes ces nouvelles fonctionnalités de VB.NET ne sont disponibles qu'avec des types de données à virgule flottante (double ou simple). Et cette flexibilité peut conduire à une certaine confusion Try-Catch-Final (gestion des erreurs structurée). Par exemple, le code .NET ci-dessus s'exécute sans lever aucune sorte d'exception, donc le coder dans un bloc Try-Catch-Final n'aidera pas. Pour tester une division par zéro, vous devez coder un test quelque chose comme:
Si c. ToString = "Infinity" Alors...
Même si vous codez le programme (en utilisant Integer au lieu des types Single ou Double), vous obtenez toujours une exception "Overflow", pas une exception "Divide by Zero". Si vous recherchez sur le Web une autre aide technique, vous remarquerez que les exemples testent tous pour OverflowException.
.NET a en fait DivideByZeroException comme type légitime. Mais si le code ne déclenche jamais l'exception, quand verrez-vous cette erreur insaisissable?
Quand vous verrez DivideByZeroException
Comme il s'avère, MicrosoftLa page MSDN de Try-Catch-Final utilise des exemples de division par zéro pour illustrer comment les coder. Mais il y a une subtile "prise" qu'ils n'expliquent pas. Leur code ressemble à ceci:
Dim a As Integer = 0
Dim b As Integer = 0
Dim c As Integer = 0
Essayer
a = b \ c
Catch exc comme exception
Console. WriteLine ("Une erreur d'exécution s'est produite")
finalement
Console. ReadLine ()
Fin de l'essai
Ce code Est-ce que déclencher une division réelle par exception zéro.
Mais pourquoi ce code déclenche-t-il l'exception et rien de ce que nous avons codé auparavant ne le fait? Et qu'est-ce que Microsoft n'explique pas?
Notez que l'opération qu'ils utilisent est ne pas diviser ("/"), c'est diviser entier ("\")! (D'autres exemples Microsoft déclarent en fait les variables comme des nombres entiers.) Il se trouve que le calcul des nombres entiers est le seulement cas qui jette en fait cette exception. Cela aurait été bien si Microsoft (et les autres pages qui copient leur code) expliquaient ce petit détail.