Проблема со стандартной обработкой ошибок в vba из-за необъяснимого зацикливания
-
02-01-2020 - |
Вопрос
Я следую инструкциям по созданию новой процедуры VBA в Access.Одной из спецификаций является использование стандартной обработки ошибок ExitProc.Я был немного сбит с толку, что это за улучшение, но я просмотрел примеры в Интернете и ранее заполненные примеры, предоставленные в качестве шаблона, я пришел к этому:
On Error GoTo HandleError
'code that may cause errors
ExitProc:
Exit Function
HandleError:
If FindFolders = False Then
MsgBox ("Required folders for " & InstrumentName & " not found")
ElseIf FindFolderPaths = False Then
MsgBox ("Required folder paths for " & InstrumentName & " not found")
End If
MsgBox Err.Number & " " & Err.Description & " in FindFolderPaths"
Resume ExitProc
End Function
findfolders - это логическая переменная, которую я пометил как false в процедуре, чтобы указать на ошибку, а FindFolderPaths - это имя процедуры, которую я использую для указания того, найдены ли пути.Когда я запускаю эту процедуру, появляются следующие поля сообщений.Я создал ошибку в имени папки, чтобы показать, как будет обработана ошибка :
-Необходимые папки для ICPM не найдены
-0 в FindFolderPaths
-Необходимые папки для ICPM не найдены
20 Возобновить работу без ошибок в FindFolderPaths
Когда я шаг за шагом прошел процедуру, похоже, что она дважды прокручивает HandleError перед переходом к ExitProc, и я не могу понять, почему.Также сообщение об ошибке изменяется во время второго цикла в HandleError, что странно.
Решение
Ваша проблема, похоже, заключается в том, что вы "неправильно используете" обработчик ошибок, вызывая его непосредственно в своем коде, используя Goto HandleError
вместо того, чтобы вызывать его автоматически при возникновении ошибки.
Это бы точно объяснило, что, по вашему сообщению, было выведено при запуске вашего кода:
-Required folders for ICPMS not found 'shows regardless of what triggers the handler
-0 in FindFolderPaths 'err number of zero means there's no error
Resume Exit Proc
затем запускает фактический ошибка при повторном вызове кода
-Required folders for ICPMS not found 'not relevant here...
-20 Resume without Error in FindFolderPaths 'an actual error number and message
Обычно, если есть какое-то условие, которое вы можете проверить (например, отсутствующая папка), вам не нужно обрабатывать это, вызывая обработчик ошибок - вы можете показать сообщение из своего "обычного" кода, а затем просто Exit function
.В качестве альтернативы можно вызвать пользовательскую ошибку, используя Err.Raise
, присвоив ему конкретный номер ошибки и описание, которые вы можете протестировать и соответствующим образом обработать в своем обработчике ошибок.
http://msdn.microsoft.com/en-us/library/office/aa164019 (v=office.10).aspx#odc_tentipsvba_topic3
Другие советы
Удалить резюме EXITPROC.Код оставит функцию, когда она попадает в завершение функции.Кроме того, вам нужно удалить скобки, когда вы звоните Msgbox.Используйте только скобки, когда вы устанавливаете что-то равное MSGBox.