问题描述
VBA 中的错误处理有哪些好的模式?
What are some good patterns for error handling in VBA?
特别是这种情况我该怎么办:
In particular, what should I do in this situation:
... some code ...
... some code where an error might occur ...
... some code ...
... some other code where a different error might occur ...
... some other code ...
... some code that must always be run (like a finally block) ...
我想处理这两个错误,并在可能发生错误的代码之后恢复执行.此外,最后的 finally 代码必须始终运行 - 无论之前抛出什么异常.我怎样才能达到这个结果?
I want to handle both errors, and resume execution after the code where the error may occur. Also, the finally code at the end must always run - no matter what exceptions are thrown earlier. How can I achieve this outcome?
推荐答案
VBA 中的错误处理
出错时转到
ErrorHandlerLabel继续
(Next
| ErrorHandlerLabel)On Error Goto 0
(禁用当前错误处理程序)Err
对象On Error Goto
ErrorHandlerLabelResume
(Next
| ErrorHandlerLabel)On Error Goto 0
(disables current error handler)Err
object
Error Handling in VBA
Err
对象的属性通常在错误处理例程中重置为零或零长度字符串,但也可以使用 Err.Clear
显式完成.
The Err
object's properties are normally reset to a zero or a zero-length string in the error handling routine, but it can also be done explicitly with Err.Clear
.
错误处理例程中的错误正在终止.
Errors in the error handling routine are terminating.
范围 513-65535 可用于用户错误.对于自定义类错误,将 vbObjectError
添加到错误编号.请参阅有关 Err 的 Microsoft 文档.提高
和错误编号列表.
The range 513-65535 is available for user errors.For custom class errors, you add vbObjectError
to the error number.See the Microsoft documentation about Err.Raise
and the list of error numbers.
对于派生类中未实现的接口成员,您应该使用常量E_NOTIMPL = &H80004001
.
For not implemented interface members in a derived class, you should use the constant E_NOTIMPL = &H80004001
.
Option Explicit
Sub HandleError()
Dim a As Integer
On Error GoTo errMyErrorHandler
a = 7 / 0
On Error GoTo 0
Debug.Print "This line won't be executed."
DoCleanUp:
a = 0
Exit Sub
errMyErrorHandler:
MsgBox Err.Description, _
vbExclamation + vbOKCancel, _
"Error: " & CStr(Err.Number)
Resume DoCleanUp
End Sub
Sub RaiseAndHandleError()
On Error GoTo errMyErrorHandler
' The range 513-65535 is available for user errors.
' For class errors, you add vbObjectError to the error number.
Err.Raise vbObjectError + 513, "Module1::Test()", "My custom error."
On Error GoTo 0
Debug.Print "This line will be executed."
Exit Sub
errMyErrorHandler:
MsgBox Err.Description, _
vbExclamation + vbOKCancel, _
"Error: " & CStr(Err.Number)
Err.Clear
Resume Next
End Sub
Sub FailInErrorHandler()
Dim a As Integer
On Error GoTo errMyErrorHandler
a = 7 / 0
On Error GoTo 0
Debug.Print "This line won't be executed."
DoCleanUp:
a = 0
Exit Sub
errMyErrorHandler:
a = 7 / 0 ' <== Terminating error!
MsgBox Err.Description, _
vbExclamation + vbOKCancel, _
"Error: " & CStr(Err.Number)
Resume DoCleanUp
End Sub
Sub DontDoThis()
' Any error will go unnoticed!
On Error Resume Next
' Some complex code that fails here.
End Sub
Sub DoThisIfYouMust()
On Error Resume Next
' Some code that can fail but you don't care.
On Error GoTo 0
' More code here
End Sub
这篇关于VBA 错误处理有哪些好的模式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!