Почему вы когда-либо использовали «On Error Goto 0»? - PullRequest
27 голосов
/ 03 апреля 2012

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

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

Ответы [ 4 ]

48 голосов
/ 03 апреля 2012

В 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

Однако может случиться так, что код, который выдает ошибку, локализован, и вам не нужен тот же обработчик для всего остального кода в подпрограмме. В этом случае вы использовали бы «При ошибке Перейти к 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

Теперь вы эффективно ограничили обработку ошибок, чтобы выполнять только в случае сбоя этой конкретной строки кода.

Вызывая «В случае ошибки Перейти к 0», вы НЕ говорите, что хотите, чтобы приложение немедленно аварийно завершало работу. Вы просто говорите, что хотите отменить регистрацию любых обработчиков ошибок, которые вы, возможно, настроили ранее в подпрограмме; ошибки будут передаваться в стек вызовов в вызывающие подпрограммы, как обычно.

8 голосов
/ 03 апреля 2012

Поскольку это неуклюже описывать словами, вот несколько примеров, показывающих, где вы можете использовать On Error GoTo 0 для локализованной, структурированной обработки ошибок.

Первым является Property Get в классе («MicroDOM»), который реализует облегченный DOM, основанный на иерархии подклассовых коллекций.В этом случае нам нужна попытка сослаться на отсутствующий дочерний элемент по имени вместо индекса, чтобы создать пустой (без атрибутов или дочерних элементов) дочерний элемент:

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

Второй - встроенный код, который удаляет файл, если онpresent:

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 там вообще не является допустимой конструкцией.

5 голосов
/ 03 апреля 2012

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

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

1 голос
/ 03 июля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...