Как повторно включить обработку ошибок по умолчанию в VB6

У меня есть код с различными обработчиками ошибок "On Error Goto" в нескольких местах для обработки сломанного стороннего оборудования. Я получал ошибку переполнения (чтение из переменной Err) в подпрограмме, которая не имеет ловушки ошибок, но вызывается подпрограммой, которая делает. Я всегда думал, что ловушки ошибок действительны только в процедуре, которую они были объявлены, но похоже, что ошибка в подпрограмме может привести к тому, что она перейдет в ловушку ошибок вызывающей функции.

поэтому я выключил вызов ловушки ошибок функции и нашел мое переполнение, и все хорошо. Но прежде чем я это сделал, я потратил некоторое время, пытаясь найти программный способ заставить VB вернуться к обработке ошибок по умолчанию внутри этой подпрограммы (поэтому мне не пришлось бы изменять внешний код для отладки), но я не мог. Единственная ошибка команды, которую я мог найти:

  On Error GoTo [label]
  On Error Resume Next
  On Error Goto 0
  On Error GoTo -1

все включить ручную обработку ошибок - есть ли способ отключить его (вернуться к VB6 по умолчанию)?

8 ответов


это подробно объясняется в руководстве VB6 в разделе Иерархия Обработки Ошибок. On Error Goto 0 отключает обработчик ошибок в настоящее процедура, а не в процедурах, которые ее вызвали.

при возникновении ошибки в процедуре и эта процедура не включена обработчик ошибок, поиск в Visual Basic назад через ожидание процедуры в списке вызовов - и выполняет первый включен обработчик ошибок, который он находит. Если это не возникает включенной ошибки обработчик в любом месте списка вызовов, это представляет непредвиденную ошибку по умолчанию сообщение и останавливает выполнение.

как говорили другие, вы можете пойти в Сервис-Параметры-Общие tab и выберите перерыв на все ошибки. Это эффективно отключает все ваши операторы On Error-IDE будет немедленно ломаться при каждой ошибке.

это может раздражать, если ваш код VB6 выдает ошибки как часть обычного операция. Например, когда вы проверяете, существует ли файл, или когда пользователь нажимает отмена в общем диалоге. Вы не хотите, чтобы IDE ломалась каждый раз на этих линиях. Но у вас могут быть стандартные обработчики ошибок во всех процедурах обработки событий, чтобы остановить сбой программы при непредвиденных ошибках. Но они являются помехой, когда вы отлаживаете проблемы, потому что IDE не ломается на линии с ошибкой. Один трюк-отключить эти обработчики ошибок при запуске в IDE, но сохраняйте их во встроенном исполняемом файле. Вы делаете это, как это.

поместите эти функции в модуль.

Public Function InIDE() As Boolean 
  Debug.Assert Not TestIDE(InIDE) 
End Function 

Private Function TestIDE(Test As Boolean) As Boolean 
  Test = True 
End Function 

тогда вы можете написать обработчики ошибок, как это.

Private Sub Form_Load() 
  If Not InIDE() Then On Error Goto PreventCrashes 
  <lots of code> 
  Exit Sub 

PreventCrashes: 
  <report the error> 
End Sub 

слизан с здесь. Еще один совет-используйте бесплатную надстройку MZTools для автоматического добавления этих обработчиков ошибок шаблона. Для кода качества производства вы можете пойти дальше и поместить обработчик ошибок в каждую процедуру, чтобы создать гетто stack trace. Вы также можете немедленно регистрировать ошибки в каждом обработчике ошибок.

EDIT: Ant правильно указал, что On Error Goto -1 это VB.Net заявление и не действителен в VB6.

EDIT: Arvo и OneNerd написали ответы с интересным обсуждением эмуляции, наконец, блоков демонтажа в обработке ошибок VB6. Обсуждение в этот вопрос также стоит посмотреть.


есть ясный и простой способ сбросить статус ошибки - используйте ключевое слово Resume. Есть три возможности:--3-->

Resume
Resume Next
Resume <Label>

возобновление продолжает выполнение на ошибочной строке, возобновление далее на следующей строке и наименее разговорная метка резюме продолжается на метке. Очень полезно создать try-catch-наконец, как конструкции в VB6. Заимствованный и модифицированный из OneNerd ответ:

Function MyFunction() as String

'-- start of error block
'
 On Error Goto Catch
   ' do something here that might cause an error
   MyFunction = "IT WORKED"
   Goto Finally

   Catch:
   ' error occured - do something else
   MyFunction = Err.Description
   Err.Clear
   Resume Finally          ''added to clear error status

 Finally:
   On Error Resume Next    ''added to avoid repeated errors
   ' put your finally code here

 '
 '-- end of error block

End Function

Просто Подстраховаться.Понятно, не поможет, если некоторые ошибки последующих происходит в блоке finally; резюме наконец сбросьте внутреннее состояние ошибки.


есть удобное меню правой кнопкой мыши, которое позволяет включать и выключать обработку ошибок. Просто щелкните правой кнопкой мыши на окно программы и выберите переключатель, затем вы можете выбрать "перерыв на все ошибки". Это приведет к отключению всех ваших операторов "On Error".


вот что я делаю:

сначала включите обработку ошибок, если это необходимо в вашем Sub Main () или Sub Form_Load () Sub:

'-- turn on error handling
'
On Error GoTo 0
'
'-------------------------

теперь ошибки будут включены.

затем используйте При Ошибке Возобновить Далее и при ошибке GoTo {label} команды в сочетании с Err


/ Tools / Options / General / Обработка Ошибок


on error goto 0

должно быть то, что вы хотите... Это должно вызвать ошибку к брошенному, и в свою очередь, вероятно, размотать до RTL...

прошло много времени, но я уверен, что это то, что вы хотите.

on error resume next

просто продолжит следующее утверждение, поэтому вам нужно иметь много

if err.Number <> 0 then

операторы в коде, где могут возникать ошибки...


должен согласиться с Ларрифом,При Ошибке Goto 0 должен отключить явную обработку ошибок, которая была включена При Ошибке Возобновить Далее. Однако функции и подпрограммы имеют свою собственную область для этого. От доктор скрипто в Microsoft:

включение возобновления ошибок далее на начало сценария, как мы часто do, делает его применимым ко всему телу из сценария. Но, как мы увидим в более поздние примеры, его сфера применения не включите функции или подпрограммы. Если вы хотите обрабатывать ошибки в функция или подпрограмма, вы также должны включить on error Resume Next в каждом из них перед проверкой Err объект.

вы можете отключить обработку ошибок с помощью По Ошибке GoTo 0. Так что это возможно включить обработку ошибок с помощью On Error Резюме Next непосредственно перед тем, как вы хотите проверьте объект Err и выключите его после С по ошибке GoTo 0.


нет "On Error GoTo -1", поэтому я понятия не имею, где вы это получили.

обработка исключений VB6 очень подробно описана в руководстве.