Początkowe książki programistyczne zwykle zawierają to ostrzeżenie: „Nie dziel przez zero! Otrzymasz błąd czasu wykonywania! ”
Wszystko się zmieniło VB.NET. Chociaż jest ich więcej programowanie opcje, a obliczenia są dokładniejsze, nie zawsze łatwo jest zrozumieć, dlaczego tak się dzieje.
Tutaj dowiadujemy się, jak radzić sobie z podziałem przez zero za pomocą obsługi błędów strukturalnych VB.NET Po drodze omawiamy także nowe stałe VB.NET: NaN, Infinity i Epsilon.
Co się stanie, jeśli uruchomisz „Divide By Zero” w VB.NET
Jeśli uruchomisz scenariusz „dziel przez zero” w VB.NET, otrzymasz następujący wynik:
Dim a, b, c As Double
a = 1: b = 0
c = a / b
Konsola. WriteLine (_
„Miej reguły matematyczne” _
i vbCrLf i _
„został uchylony?” _
i vbCrLf i _
"Dzielenie przez zero " _
i vbCrLf i _
„musi być możliwe!”)
Co się tu dzieje? Odpowiedź jest taka, że VB.NET faktycznie daje matematycznie poprawną odpowiedź. Matematycznie ty mogą dziel przez zero, ale dostajesz „nieskończoność”.
Dim a, b, c As Double
a = 1: b = 0
c = a / b
Konsola. WriteLine (_
"Odpowiedź to: " _
i c)
„Wyświetla:
„Odpowiedź brzmi: nieskończoność
Wartość „nieskończoność” nie jest zbyt przydatna w przypadku większości aplikacji biznesowych. (Chyba że CEO zastanawia się, jaki jest górny limit jego premii giełdowej.) Ale to nie powoduje awarii twoich aplikacji z wyjątkiem środowiska uruchomieniowego, tak jak robią to słabsze języki.
VB.NET zapewnia jeszcze większą elastyczność, umożliwiając nawet wykonywanie obliczeń. Sprawdź to:
Dim a, b, c As Double
a = 1: b = 0
c = a / b
c = c + 1
„Nieskończoność plus 1 to
„wciąż nieskończoność
Aby pozostać matematycznie poprawnym, VB.NET daje odpowiedź NaN (Not a Number) dla niektórych obliczeń, takich jak 0/0.
Dim a, b, c As Double
a = 0: b = 0
c = a / b
Konsola. WriteLine (_
"Odpowiedź to: " _
i c)
„Wyświetla:
„Odpowiedź brzmi: NaN
VB.NET może także odróżnić dodatnią nieskończoność od ujemnej nieskończoności:
Dim a1, a2, b, c As Double
a1 = 1: a2 = -1: b = 0
Jeśli (a1 / b)> (a2 / b) To _
Konsola. WriteLine (_
„Pozytywna nieskończoność to” _
i vbCrLf i _
"Lepszy niż" _
i vbCrLf i _
„ujemna nieskończoność”)
Oprócz PositiveInfinity i NegativeInfinity, VB.NET zapewnia także Epsilon, najmniejszą dodatnią wartość Double większą niż zero.
Należy pamiętać, że wszystkie te nowe funkcje VB.NET są dostępne tylko dla typów danych zmiennoprzecinkowych (Double lub Single). Ta elastyczność może prowadzić do zamieszania w trybie Try-Catch-Final (obsługa błędów strukturalnych). Na przykład powyższy kod .NET działa bez zgłaszania żadnego wyjątku, więc kodowanie go w bloku Try-Catch-Final nie pomoże. Aby przetestować dzielenie przez zero, musisz zakodować test w stylu:
Jeśli c. ToString = "Infinity" Następnie...
Nawet jeśli kodujesz program (używając liczb całkowitych zamiast typów pojedynczych lub podwójnych), nadal otrzymujesz wyjątek „Overflow”, a nie wyjątek „Divide by Zero”. Jeśli przeszukujesz internet w poszukiwaniu innej pomocy technicznej, zauważysz, że wszystkie przykłady testują wyjątek OverflowException.
.NET faktycznie ma DivideByZeroException jako prawidłowy typ. Ale jeśli kod nigdy nie wyzwala wyjątku, to kiedy zobaczysz ten nieuchwytny błąd?
Kiedy zobaczysz DivideByZeroException
Jak się okazuje, MicrosoftStrona MSDN na temat bloków Try-Catch-Wreszcie używa przykładów dzielenia przez zero, aby zilustrować sposób ich kodowania. Ale istnieje subtelny „haczyk”, którego nie wyjaśniają. Ich kod wygląda następująco:
Dim a As Integer = 0
Dim b As Integer = 0
Dim c As Integer = 0
Próbować
a = b \ c
Catch exc As Exception
Konsola. WriteLine („Wystąpił błąd w czasie wykonywania”)
Wreszcie
Konsola. Czytaj linię()
Zakończ próbę
Ten kod robi wywołać rzeczywisty podział przez zero wyjątku.
Ale dlaczego ten kod wyzwala wyjątek i nic, co wcześniej zakodowaliśmy? A czego Microsoft nie wyjaśnia?
Zauważ, że operacja, której używają, to nie divide („/”), to liczba całkowita divide („\”)! (Inne przykłady Microsoft faktycznie deklarują zmienne jako liczby całkowite.) Jak się okazuje, obliczanie liczb całkowitych to tylko przypadek, który faktycznie zgłasza ten wyjątek. Byłoby miło, gdyby Microsoft (i inne strony, które kopiują swój kod) wyjaśnił tak mało szczegółów.