Как повторно включить обработку ошибок по умолчанию в VB6 - PullRequest
8 голосов
/ 10 апреля 2009

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

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

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

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

Ответы [ 8 ]

10 голосов
/ 15 апреля 2009

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

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

Как уже говорили другие, вы можете перейти на вкладку Tools-Options-General и выбрать Break на всех ошибках . Это фактически отключает все ваши операторы 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 для автоматического добавления этих стандартных обработчиков ошибок. Что касается кода производственного качества, вы можете пойти дальше и добавить обработчик ошибок в каждую подпрограмму для создания трассировки стека гетто . Вы также можете сразу регистрировать ошибки в каждом обработчике ошибок.

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

РЕДАКТИРОВАТЬ: Arvo и OneNerd написали ответы с интересным обсуждением эмуляции, наконец, разделительных блоков в обработке ошибок VB6. Обсуждение в этот вопрос также стоит посмотреть.

3 голосов
/ 16 апреля 2009

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

Resume
Resume Next
Resume <Label>

Resume продолжает выполнение в строке с ошибкой, Resume Next в следующей строке и наименее обсуждаемая метка Resume продолжается в метке Очень полезно для создания конструкций типа try-catch-finally в 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

Простая ошибка Err.Clear не помогает, если в блоке finally происходит какая-то последующая ошибка; Resume Наконец сбрасывает состояние внутренней ошибки.

1 голос
/ 10 апреля 2009

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

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

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

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

Далее используйте команды On Error Resume Next и On Error GoTo {label} в сочетании с объектом Err . Вот пример эмуляции try / catch / finally:

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

 Finally:
   ' put your finally code here

 '
 '-- end of error block

End Function
1 голос
/ 10 апреля 2009

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

0 голосов
/ 11 апреля 2009

Нет "On Error GoTo -1", поэтому я понятия не имею, откуда вы это взяли.

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

0 голосов
/ 10 апреля 2009

Согласиться с LarryF, On Error Goto 0 должен отключить явную обработку ошибок, которая была включена On Error Resume Next . Хотя функции и подпрограммы имеют свои собственные возможности для этого. От д-р. Скрипт в Microsoft :

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

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

0 голосов
/ 10 апреля 2009
on error goto 0

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

Это было давно, но я почти уверен, что ты этого хочешь.

on error resume next

просто перейдет к следующему утверждению, поэтому вам НУЖНО иметь много

if err.Number <> 0 then

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

0 голосов
/ 10 апреля 2009

/ Инструменты / Параметры / Общие / Обработка ошибок

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