NaN, nieskończoność i dzielenie przez zero w VB.NET
Początkowe książki o programowaniu zazwyczaj zawierają ostrzeżenie: „Nie dziel przez zero! Otrzymasz błąd w czasie wykonywania!'
Rzeczy się zmieniły w VB.NET . Chociaż jest ich więcej programowanie opcje i obliczenia są dokładniejsze, nie zawsze łatwo jest zobaczyć, dlaczego rzeczy dzieją się tak, jak się dzieje.
Tutaj dowiadujemy się, jak obsługiwać dzielenie przez zero za pomocą strukturalnej obsługi błędów VB.NET. Po drodze omówimy również nowe stałe VB.NET: NaN, Infinity i Epsilon.
Co się stanie, jeśli uruchomisz „Podziel przez zero” w VB.NET?
Jeśli uruchomisz scenariusz 'dzielenia przez zero' w VB.NET, otrzymasz następujący wynik:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Więc co się tutaj dzieje? Odpowiedź jest taka, że VB.NET faktycznie daje matematycznie poprawną odpowiedź. Matematycznie, ty Móc podziel przez zero, ale otrzymujesz „nieskończoność”.
|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Wartość „nieskończoność” nie jest zbyt użyteczna dla większości aplikacji biznesowych. (Chyba, że dyrektor generalny nie zastanawia się, jaki jest górny limit jego premii giełdowej.) Ale zapobiega to awariom aplikacji w przypadku wyjątku w czasie wykonywania, tak jak robią to mniej zaawansowane języki.
VB.NET zapewnia jeszcze większą elastyczność, umożliwiając nawet wykonywanie obliczeń. Spójrz na to:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Aby zachować matematyczną poprawność, VB.NET daje odpowiedź NaN (Not a Number) dla niektórych obliczeń, takich jak 0 / 0.
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
VB.NET może również odróżnić nieskończoność dodatnią od nieskończoności ujemnej:
|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Oprócz PositiveInfinity i NegativeInfinity, VB.NET udostępnia również Epsilon, najmniejszą dodatnią wartość Double większą od zera.
Należy pamiętać, że wszystkie te nowe możliwości VB.NET są dostępne tylko w przypadku typów danych zmiennoprzecinkowych (podwójny lub pojedynczy). Ta elastyczność może prowadzić do zamieszania związanego z Try-Catch-Final (obsługa błędów strukturalnych). Na przykład powyższy kod platformy .NET jest uruchamiany bez zgłaszania wyjątku, więc kodowanie go w bloku Try-Catch-Finally nie pomoże. Aby przetestować dzielenie przez zero, musiałbyś zakodować test podobny do:
|_+_||_+_|
Nawet jeśli kodujesz program (przy użyciu typu Integer zamiast typu Single lub Double), nadal otrzymujesz wyjątek „Przepełnienie”, a nie wyjątek „Podziel przez zero”. Jeśli przeszukujesz sieć w poszukiwaniu innej pomocy technicznej, zauważysz, że wszystkie przykłady testują dla OverflowException.
W rzeczywistości .NET ma wyjątek DivideByZeroException jako prawidłowy typ. Ale jeśli kod nigdy nie wywoła wyjątku, kiedy zobaczysz ten nieuchwytny błąd?
Kiedy zobaczysz wyjątek Podziel przezZero
Jak się okazuje, Microsoft Strona MSDN poświęcona blokom Try-Catch-Final w rzeczywistości wykorzystuje przykłady dzielenia przez zero, aby zilustrować sposób ich kodowania. Ale jest subtelny „haczyk”, którego nie wyjaśniają. Ich kod wygląda tak:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Ten kod czy wyzwalać rzeczywisty wyjątek dzielenia przez zero.
Ale dlaczego ten kod wyzwala wyjątek, a nic, co wcześniej zakodowaliśmy, nie? A czego Microsoft nie wyjaśnia?
Zauważ, że operacja, której używają, to nie dziel ('/'), to liczba całkowita dziel ('')! (Inne przykłady firmy Microsoft faktycznie deklarują zmienne jako liczby całkowite). Jak się okazuje, obliczanie liczb całkowitych to tylko przypadku, który faktycznie zgłasza ten wyjątek. Byłoby miło, gdyby Microsoft (i inne strony kopiujące ich kod) wyjaśnił ten mały szczegół.