Обработване на логически грешки - Logical Errors
- Откриване на
логически грешки - Detecting Logical Errors
За да открием логическа грешка, ние поставяме (error-detection) кода за откриване на грешки
непосредствено следвайки потенциалния край на обработка (offender). Нека имаме процедура за приемане на последователност от цели числа
от потребителя, като стартираме с броя на числата:
Public
Sub GetSomeData( )
Dim
DataCt As Integer
DataCt
= CInt(InputBox("Enter number of items."))
' код за получаване на
индивидуалните стойности на данните ...
End
Sub
Подходящото място за error-detecting кода е непосредствено след
функция InputBox, където можем да проверим за
отрицателни числа:
Public
Sub GetSomeData( )
Dim
DataCt As Integer
DataCt
= CInt(InputBox("Enter number of items."))
' проверка за грешки
If
DataCt < = 0 then
' нещо полезно тук
End
If
' код за получаване на
индивидуалните стойности на данните ...
End
Sub
- Къде да обработваме
логически грешки - Logical Error
След като открием логическа
грешка, имаме три избора за обработване на тази грешка.
8.3.1 Обработване на
грешка на място
Логическа грешка може да бъде
обработена на мястото, където е открита Ето пример:
Public
Sub GetSomeData( )
TryAgain:
DataCt
= CInt(InputBox("Enter number of items."))
' проверка за грешки
If
DataCt < = 0 then
If
MsgBox("Number must be a positive integer." & _
"
Try again or cancel.", vbQuestion+vbOKCancel) _
=
vbOK then
Goto
TryAgain
Else
Exit
Sub
End
If
End
If
' код за получаване на
индивидуалните стойности на данните ...
End
Sub
Обработка на логическа грешка на
място е целесъобразна, когато необходимия код е кратък. Целесъобразно е в
процедури на свойства (Property
procedures), които често изискват няколко реда за инстанция на променливата
и валидизация на данните.
Обработване
на грешка в манипулатор на грешка (error handler) на приключваща процедура (offending)
Можем да дублираме процедурата,
която Visual Basic използва за грешки по време на
изпълнение, просто при вдигане на собствена грешка от този тип (runtime error). Eто пример за структурирано обработване на грешки:
Try
Dim
DataCt As Integer = CInt(InputBox("Enter number of items."))
' проверка за грешки
If
DataCt <= 0 Then
' хващане на изключение
Throw
New Exception("Must enter a positive number.")
End
If
Catch
ex As Exception
MsgBox(ex.Message)
End
Try
Забележете че конструкторът на Exception class (в една от своите
предефинирани - overloaded форми) е:
Overloads
Public Sub New(String)
където String е съобщението за грешка, което
трябва да бъде асоциирано с грешката.
Ето един пример за вдигане на
грешка, чрез неструктурирано обработване на грешки:
Public
Sub GetSomeData( )
On
Error Goto ErrGetSomeData
DataCt
= CInt(InputBox("Enter number of items."))
' проверка за грешки
If
DataCt < = 0 then
' вдигане на грешка
Err(
).Raise Number:= ErrBadDataCt
End
If
' код за получаване на
индивидуалните стойности на данните ...
Exit
Sub
' Error-handler
ErrGetSomeData:
Select
Case Err( ).Number
Case
ErrBadDataCt
'' справяне с грешката
чрез извеждане на съобщение
'' което търси помощ от
потребителя
Case
Else
'' справяне с другите
грешки
End
Select
Exit
Sub
End
Sub
8.3.2
Подаване на грешка към викащата процедура
Подаването на грешка към викащата
процедура може да бъде направено с параметър на offending процедура или като върната стойност на offending функция. Значи, манипулаторът на грешки - error handler на викащата процедура може да се вика чрез вдигане на
грешка.