Разница между Resume и Goto в блоке обработки ошибок - PullRequest
13 голосов
/ 08 июня 2010

Я понимаю, что в следующем примере вместо оператора Goto должен использоваться оператор Resume.

Sub Method()
  On Error Goto ErrorHandler
  ...
CleanUp:
  ...
  Exit Function

ErrorHandler:
  Log error etc

  Err.Clear  'Is this line actually necessary?'

  Resume CleanUp 'SHOULD USE THIS'
  Goto CleanUp  'SHOULD NOT USE THIS'
End Sub

У меня вопрос, какая разница в исполнении двух?

Ответы [ 2 ]

22 голосов
/ 08 июня 2010

Оба переносят выполнение на метку Cleanup. Насколько я помню, единственные отличия

  • Использование Goto не очищает объект Err (поэтому Err.Clear необходимо, если вы используете Goto), и оставляет обработчик ошибок отключенным. Если ошибка появляется после метки Cleanup, она не будет обработана в ErrorHandler.
  • Использование Resume очищает объект Err и снова включает ваш обработчик ошибок (он отключен во время обработки ошибок). Если после метки Cleanup возникает ошибка, она будет обработана в ErroHandler

Ручная запись VB6 для оператора Resume не объясняет этих различий.

2 голосов
/ 10 мая 2016

Это большое недоразумение! Существует важная разница между:

Err.Clear
GoTo CleanUp

и

Resume CleanUp

НИКОГДА не используйте первую форму, ВСЕГДА используйте Resume CleanUp (только). Возобновите выполнение СБРОСА состояния внутренней ошибки VB6, поэтому при возникновении ДРУГОЙ ошибки будет применено «On Error GoTo Label». Если вы используете «Err.Clear», тогда объект Err очищается, но состояние ВНУТРЕННЕЙ ошибки НЕ очищается, и при возникновении другой ошибки он рассматривается как код БЕЗ какого-либо обработчика исключений и выбрасывает вне функции. Вы НЕ МОЖЕТЕ исправить это, используя «On Error GoTo Label2»

Рассмотрим этот код:

Public Sub Test()
On Error GoTo L1
MsgBox 0 / (1 - 1)
Exit Sub

L1:
  Err.Clear
L0:
  On Error GoTo L2
  MsgBox 0 / (1 - 1) 'ERROR!
  Exit Sub

L2:
  MsgBox Err
End Sub

Если вы запустите это, оно прервется на "ОШИБКА!" линия. Если вы замените «Err.Clear» на «Resume L0», выполнение не прервется на «ERROR!» строка и код переходят на метку «L2» и выдают «MsgBox Err»

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