VB6 中将错误传递回调用函数的最佳方法是什么?
1 On Error Resume Next
2 ' do something
3 If Err.Number <> 3026 Or Err <> 0 Then ?????????
您如何将第 3 行中的错误发送回调用函数?以下是实现这一目标的唯一方法吗?
errNum = Err.Number
On Error Goto 0
Err.Raise errNum
VB6 中将错误传递回调用函数的最佳方法是什么?
1 On Error Resume Next
2 ' do something
3 If Err.Number <> 3026 Or Err <> 0 Then ?????????
您如何将第 3 行中的错误发送回调用函数?以下是实现这一目标的唯一方法吗?
errNum = Err.Number
On Error Goto 0
Err.Raise errNum
在处理程序中使用On Error GoTo
并重新引发错误Err.Raise
。
Private Function DoSomething(ByVal Arg as String)
On Error GoTo Handler
Dim ThisVar as String
Dim ThatVar as Long
' Code here to implement DoSomething...
Exit Function
Handler:
Err.Raise Err.Number, , "MiscFunctions.DoSomething: " & Err.Description
End Function
然后,您将能够通过Err.Number
和获取调用者中的错误号和描述Err.Description
。
如果调用者也在使用On Error GoTo
,您将在那里的处理程序中看到它们。
如果调用者正在使用On Error Resume Next
,那么您仍然可以内联使用这些相同的变量。
我更喜欢第一个选项,在所有函数和子程序中使用 On Error Goto,因为这似乎是使用 VB6 内置错误引发功能的自然方式。您还可以像上面的示例一样更新被调用函数的处理程序中的描述,并获得一个伪调用堆栈,您最终可以在调试期间记录或显示给自己。
更多 VB6 错误处理思路:
为什么不添加ByRef errorCode as Long
到被调用函数的 args 并将其设置为等于 Err.Number 之后' do something
或者你可以有一个名为的公共字段ErrorCode as Long
,你可以在之后设置' do something
我使用过很多工业控制 API,并且这两种方法都被使用过。
如果您只是想将错误传递回原始调用者而不处理它,那么您想删除子函数中的任何 ON ERROR :
Public Sub ParentSub()
On Error GoTo ErrorHandler
' do something
Call ChildSub()
' do something
Exit Sub
ErrorHandler:
' handle the error here
End Sub
Public Sub ChildSub()
' do something
' if there is an error here, the error will be handled in ErrorHandler of ParentSub
End Sub
或者如果你想在两个潜艇中处理它:
Public Sub ParentSub()
On Error GoTo ErrorHandler
' do something
Call ChildSub()
' do something
Exit Sub
ErrorHandler:
' handle the error here
End Sub
Public Sub ChildSub()
On Error GoTo ErrorHandler
' do something
Exit Sub
ErrorHandler:
' handle the error here and pass it back to the ParentSub to handle it as well
Err.Raise Err.Number
End Sub
只要引发错误的函数没有(ON ERROR RESUME ---),您就可以轻松地将错误发送到上层(调用)子/函数,这样,错误处理只留在上层。否则你将不得不处理被调用函数内部的错误
Private Sub Command1_Click()
Dim test As Integer
On Error Resume Next
test = myFunction 'Calling a function that is known to have an error
If Err <> 0 Then
MsgBox "MyFunction failed because:" & Err.Description 'Error is passed
End If
End Sub
'--------------------------
Function myFunction() As Integer
Dim i As Integer
i = 1
i = 4 / 0 'This will raise an Error, and control returns to the calling sub
i = 2 'This will never get executed
myFunction = i
End Function