Зачем вам когда-либо использовать "On Error Goto 0"
в приложении VB6?
Этот оператор отключает обработчик ошибок и будет означать, что любая ошибка приведет к сбою приложения. Почему это когда-либо было бы желательно?
Зачем вам когда-либо использовать "On Error Goto 0"
в приложении VB6?
Этот оператор отключает обработчик ошибок и будет означать, что любая ошибка приведет к сбою приложения. Почему это когда-либо было бы желательно?
В VB6 вы можете указать, что вы хотите, чтобы ошибки обрабатывались конкретным кодом позже в подпрограмме:
Sub Bar()
On Error Goto MyHandler
...
...some code that throws an error...
...
Exit Sub
MyHandler:
...some error handler code (maybe pops up a dialog)
End Sub
Однако может случиться, что код, который выдает ошибку, локализован, и вы не хотите, чтобы тот же самый обработчик для всего остального кода в подпрограмме. В этом случае вы должны использовать "On Error Goto 0" следующим образом:
Sub Bar()
...
On Error Goto MyHandler
...some code that throws an error...
On Error Goto 0
...
...
Exit Sub
MyHandler:
...some error handler code (maybe pops up a dialog)
End Sub
Теперь вы эффективно охватили обработку ошибок для выполнения только в случае сбоя этой конкретной строки кода.
Вызывая "On Error Goto 0", вы не говорите, что хотите, чтобы приложение немедленно сработало. Вы просто говорите, что хотите отменить регистрацию любых обработчиков ошибок, которые вы, возможно, установили ранее в подпрограмме; ошибки будут переданы в стек вызовов для вызова процедур, как обычно.
Так как это кажется неуклюжим для описания словами, вот несколько примеров, показывающих, где вы можете использовать On Error GoTo 0
для локализованной структурированной обработки ошибок.
Первый - это Property Get
в классе ( "MicroDOM" ), который реализует легкую DOM, основанную на иерархии подклассифицированных коллекций. В этом случае мы хотим попытаться ссылаться на отсутствующего Ребенка по имени вместо индекса, чтобы создать пустую (без attrbutes или children) Child:
Public Property Get Child(ByVal Key As Variant) As MicroDOM
If mChildren Is Nothing Then
Set mChildren = New Collection
End If
On Error Resume Next
Set Child = mChildren(Key)
If Err Then
On Error GoTo 0
If VarType(Key) = vbString Then
Key = Trim$(Key)
Set Child = New MicroDOM
Child.Key = Key
mChildren.Add Child, Key
Else
Err.Raise 9 'Subscript error as thrown by the Collection.
End If
End If
End Property
Второй - это встроенный код, который удаляет файл, если он присутствует:
On Error Resume Next
Kill strFilePath
On Error GoTo 0
Третий - это встроенный код, который принимает действие только в том случае, если файл присутствует:
On Error Resume Next
GetAttr strFilePath
If Err Then
On Error GoTo 0
ProcessTheData strFilePath
End If
On Error GoTo 0
Хотя это может показаться неудобным для непосвященных (выполнение On Error GoTo 0
в двух местах), результат менее неуклюжий и более структурированный, чем с плотами On Error GoTo Label
, которые перескакивают назад и вперед, чтобы обрабатывать различные исключения.
Бонус в том, что вы получаете переносимость для VBScript, так как On Error GoTo Label
вообще не является допустимой конструкцией.
Он отключает обработку ошибок только в процедуре CURRENT. Если в вызывающей процедуре есть обработчик ошибок, он поймает любые исключения, которые не были обработаны. VB продолжает поднимать стек вызовов, пока не найдет обработчик ошибок. Если он не обнаружит THEN, это вызовет ошибку времени выполнения.
Итак, для примера - возможно, у вас есть функция-обертка, которая вызывает некоторую стороннюю утилиту, которая может вызывать исключение. Вместо обработки исключений в функции обертки вы помещаете там On Error Goto 0
. Таким образом, вызывающая сторона функции-обертки затем получит исключение, переданное ему, и, надеюсь, обработает его надлежащим образом.
Вы можете найти эту ссылку полезной: http://answers.microsoft.com/en-us/office/forum/office_2010-excel/why-on-error-resume-next-and-on-error-goto-0-have/a110548f-95c9-44ac-89bc-19697641804a?auth=1
В основном это объясняет, что On Error Resume Next сообщает VB пропустить все найденные ошибки и перейти к следующей процедуре или строке вашего кода, а On Error GoTo 0 восстанавливает обработку ошибок по умолчанию.