Почему обработчик ошибок срабатывает без ошибок? - PullRequest
1 голос
/ 19 сентября 2019

Я запускаю одну строку кода, чтобы открыть PDF при нажатии кнопки.Я помещаю туда обработчик ошибок на случай, если файл не существует.Проблема в том, что код работает, и файл открывается, но обработчик ошибок все еще работает.

Когда я отключаю код обработки ошибок, он работает нормально, и VB не генерирует ошибку.Я даже попытался использовать Err.Description для окна сообщения, и оно просто выскакивает, но ничего не отображается.Вот мой код:

Private Sub cmdOpenPDF_Click()

On Error GoTo Errorhandler
 Application.FollowHyperlink "E:\groups\folder\folder2\" & Dir("E:\groups\folder\folder2\*" & Me.txtInvNum & "*")

Errorhandler:
        MsgBox "Unable to locate the file. I'm sorry this has happened.", vbOKOnly
  Exit Sub


End Sub

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

1 Ответ

2 голосов
/ 19 сентября 2019

В вашем коде Errorhandler - это просто метка строки , с оператором On Error, перенаправляющим оценку на эту метку в случае ошибки.

Таким образом, рассмотримчто VBA не различает метку строки, используемую для обработки ошибок, или любую другую метку строки, используемую в сочетании с любым другим оператором GoTo, или метку строки, на которую вообще нет ссылки.

При отсутствии ошибки ваш код эквивалентен:

Private Sub cmdOpenPDF_Click()
    Application.FollowHyperlink "E:\groups\folder\folder2\" & Dir("E:\groups\folder\folder2\*" & Me.txtInvNum & "*")

Errorhandler:
    MsgBox "Unable to locate the file. I'm sorry this has happened.", vbOKOnly
    Exit Sub
End Sub

Здесь VBA покорно выполнит метод FollowHyperlink, за которым следует функция MsgBox, а затем, наконец, Exit Subоператор.

Чтобы избежать обработки обработчика ошибок каждый раз, типичная реализация обработчика ошибок будет включать дополнительную метку, обозначающую чистый выход перед меткой обработчика ошибок, например:

Private Sub cmdOpenPDF_Click()
    On Error GoTo Errorhandler
    Application.FollowHyperlink "E:\groups\folder\folder2\" & Dir("E:\groups\folder\folder2\*" & Me.txtInvNum & "*")

ExitSub:
    Exit Sub

Errorhandler:
    MsgBox "Unable to locate the file. I'm sorry this has happened.", vbOKOnly
    Resume ExitSub
End Sub

Это означает, что в нормальных условиях оператор Exit Sub будет достигнут до оценки кода, следующего за меткой Errorhandler.

...