Почему сообщение в процедуре обработки ошибок печатается дважды? - PullRequest
0 голосов
/ 29 июня 2019

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

Sub error_test()


On Error GoTo errorhandler

Err.Raise (7)
MsgBox "one"

errorhandler:
MsgBox "two"
Resume Next

End Sub

выводит "два", "один"," два "," два "

почему" два "печатается дважды в конце?

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Это немного понятнее:

Sub error_test()

    On Error GoTo errorhandler

    Err.Raise (7)
    Debug.Print "one"

errorhandler:
    Debug.Print Err.Number, "two"
    Resume Next

End Sub

Выход:

 7            two
one
 0            two
 20           two

Первый раз, когда он входит в блок обработки ошибок, это происходит из-за Err.Raise, во второй раз он просто попадает в него сразу после вызова MsgBox, а в третий раз это Resume Next, который его запускает.

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/resume-without-error-error-20

Вы не можете использовать Resume Next, если в данный момент не обрабатываете ошибку.

1 голос
/ 29 июня 2019

У вас должен быть Exit Sub до вашего обработчика ошибок.

В противном случае он запускается, нажимая «Два» после рейза, а затем возвращается в процесс, нажимая «Один».

Затем он входит в обработчик ошибок в обычном режиме и снова нажимает «Два».

После этого он пытается выполнить команду Resume, которая является ошибкой, поскольку она не находится в режиме ошибок.Поскольку имеется обработчик ошибок, он переходит в обработчик ошибок и выводит «Два» в дополнительное время.На этот раз он может возобновиться и находится в нижней части процедуры.

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