Хотя это не лучший способ использовать предложение GOTO, просто из любопытства я хотел бы спросить, почему третий последний оператор, использующий предложение GOTO, не работает в приведенной ниже процедуре.
Подпроцедура вычисляет квадратный корень из положительного числа. Если задано отрицательное число, вступит в силу сеанс контроля ошибок, в котором спрашивается, будет ли пользователь повторно реализовывать подпрограмму снова. Сначала я ввел -1, появится запрос «Хотите попробовать еще раз?»; позже введено -2, возникает непредвиденная ошибка. щелкните, чтобы увидеть изображение непредвиденной ошибки. Если я заменю GOTO на «resume» или вызову сам суб, никаких непредвиденных ошибок не произойдет.
Одна интерпретация такова: «потому что исходное состояние ошибки не было устранено». (Джон Уокенбах). Может ли кто-нибудь предложить дополнительные разъяснения по этому поводу?
Sub enterSqrt3()
Dim pos_num As Variant, ans As Double, decision As Variant
TryAgain:
On Error GoTo errHandle
pos_num = InputBox("Please input a positive number. ")
If pos_num = "" Then
Exit Sub
Else
ans = Sqr(pos_num)
MsgBox "The answer is " & ans
Exit Sub
End If
errHandle:
decision = MsgBox("Would you like to try again? ", vbYesNo)
If decision = vbYes Then
' Resume TryAgain ' it works
' Call enterSqrt3 ' it works
GoTo TryAgain ' it does not work after input the second
' negative input.
End If
End Sub
Вам необходимо добавить On Erroro Goto -1, см. здесь для объяснения.
@Rory доза означает, что первое исключение все еще активно, поэтому при возникновении новой ошибки вторая ошибка не запускает обработчик исключений?
да. И если вы обнаружите, что используете On Error Goto -1, вам нужно остановиться и внимательно посмотреть на то, что вы делаете. ;)
Просто взгляните на примеры по предоставленной ссылке. @Rory: Да, использовать On Error Goto -1, конечно, не рекомендуется.
Также добавьте обработчик ошибок, все из errHandle:, за пределами основной части процедуры. Поместите Exit Sub непосредственно перед errHandle, а не в блок кода IF.


Как уже упоминалось, вы не удалили активное исключение - см. excelmatters.com/2015/03/17/on-error-wtf