Подтвердить что ты не робот

Зачем вам использовать "On Error Goto 0"?

Зачем вам когда-либо использовать "On Error Goto 0" в приложении VB6?

Этот оператор отключает обработчик ошибок и будет означать, что любая ошибка приведет к сбою приложения. Почему это когда-либо было бы желательно?

4b9b3361

Ответ 1

В 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", вы не говорите, что хотите, чтобы приложение немедленно сработало. Вы просто говорите, что хотите отменить регистрацию любых обработчиков ошибок, которые вы, возможно, установили ранее в подпрограмме; ошибки будут переданы в стек вызовов для вызова процедур, как обычно.

Ответ 2

Так как это кажется неуклюжим для описания словами, вот несколько примеров, показывающих, где вы можете использовать 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 вообще не является допустимой конструкцией.

Ответ 3

Он отключает обработку ошибок только в процедуре CURRENT. Если в вызывающей процедуре есть обработчик ошибок, он поймает любые исключения, которые не были обработаны. VB продолжает поднимать стек вызовов, пока не найдет обработчик ошибок. Если он не обнаружит THEN, это вызовет ошибку времени выполнения.

Итак, для примера - возможно, у вас есть функция-обертка, которая вызывает некоторую стороннюю утилиту, которая может вызывать исключение. Вместо обработки исключений в функции обертки вы помещаете там On Error Goto 0. Таким образом, вызывающая сторона функции-обертки затем получит исключение, переданное ему, и, надеюсь, обработает его надлежащим образом.

Ответ 4

Вы можете найти эту ссылку полезной: 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 восстанавливает обработку ошибок по умолчанию.