VB6: влияет ли «On Error Goto 0» на обработчик ошибок для вызывающей функции? - PullRequest
2 голосов
/ 22 июня 2010

Если в Sub VB6 вызывается On Error Goto 0, будет ли это отключать обработку ошибок, даже если управление возвращается к вызывающей функции / суб?что показывает номер ошибки 0, что это означает?

Ответы [ 3 ]

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

Нет. Руководство VB6 разъясняет , что On Error Goto 0 влияет только на текущую процедуру:

On Error Goto 0 отключает все включено обработчик ошибок в текущем процедура.

РЕДАКТИРОВАТЬ Теперь есть дополнение к вопросу, которого не было, когда я отправил этот ответ. Вопрос: «Если у меня есть вывод в блоке обработчика ошибок, который показывает номер ошибки 0, что это означает?». Ответ см. Ответ Майка.

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

Если у меня есть вывод в блоке обработки ошибок, который показывает номер ошибки 0, что это означает?

Это означает, что объект Err не содержал информацию об ошибке в той точке кода, где вы проверили свойство Err.Number. Это может произойти по ряду разных причин:

  • Объект Err был явно очищен предыдущим вызовом Err.Clear
  • Объект Err был очищен путем вызова On Error Goto. Оператор On Error Goto очистит текущий Err объект
  • Объект Err был очищен с помощью оператора Resume X. В отличие от обычного оператора Goto X, Resume очистит текущий объект Err (и выдаст собственную ошибку, если объект Err уже пуст)
  • Вы забыли выйти из текущего Sub / Function / Property до достижения обработчика ошибок, например:

    Public Sub SampleRoutine
    
       On Error Goto ErrorHandler
    
       DoSomething
       DoSomethingElse
    
       ' You need an Exit Sub here so that the code does not reach the error handler'
       'in the event no error occurs.'
    
    ErrorHandler:
    
       MsgBox Err.Number & "-" & Err.Description
    
    End Sub
    

Это довольно распространенная ошибка в моем опыте. Если вы явно не выйдете из подпрограммы до того, как достигнете метки обработчика ошибок, код в обработчике ошибок все равно будет выполняться, даже если ошибок не возникнет. В этом случае Err.Number будет равно 0, поскольку ошибки не было.

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

номер

http://www.vb -helper.com / tut6.htm

When a program encounters an error, Visual Basic 
checks to see if an error handler is presently installed 
in the current routine. If so, control passes to that error handler.

If no error handler is in effect, Visual Basic moves
up the call stack to the calling routine to see if
an error handler is currently installed there. If so,
the system resumes execution at that error handler.

If no error handler is installed in the calling routine
either, Visual Basic continues moving up the call stack 
until it finds a routine with an error handler installed. 
If it runs off the top of the stack before it finds an 
active error handler, the program crashes. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...