本文介绍了VBA 错误处理有哪些好的模式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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 对象
  • Error Handling in VBA

    • On Error Goto ErrorHandlerLabel
    • Resume (Next | ErrorHandlerLabel)
    • On Error Goto 0 (disables current error handler)
    • Err object
    • 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 错误处理有哪些好的模式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-22 16:53
查看更多