由于无法解释的循环而导致vba中标准错误处理的问题
-
02-01-2020 - |
题
我正在遵循有关在Access中创建新VBA过程的说明。其中一个规范是使用标准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是我正在使用的过程的名称,作为是否找到路径的指示。当我运行此过程时,会出现以下msg框。我在文件夹名称中创建了一个错误,以显示错误将如何处理 :
-未找到ICPMS所需文件夹
-0在FindFolderPaths
-未找到ICPMS所需文件夹
-20在FindFolderPaths中恢复没有错误
当我一步一步地完成这个过程时,它看起来像是在ExitProc之前通过HandleError循环两次,我无法弄清楚为什么。此外,错误消息在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
其他提示
删除resume exitproc。代码将在遇到结束功能时留下该函数。此外,您需要在呼叫MsgBox时删除括号。当您设置等于MsgBox时,才会使用括号。