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
答案 0 :(得分:2)
使用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
,那么您仍然可以使用内联相同的变量。
我更喜欢第一个选项,在所有函数和subs中使用On Error Goto,因为它似乎是使用VB6内置错误提升功能的自然方式。您还可以更新被调用函数的处理程序中的描述,如上例所示,并获取一个伪调用堆栈,您最终可以在调试期间记录或显示给自己。
这里有更多VB6错误处理的想法:
Is it possible to retrieve the call stack programmatically in VB6?
答案 1 :(得分:0)
为什么不将ByRef errorCode as Long
添加到被调用函数的args中,并在' do something
之后将其设置为等于Err.Number
或者您可以在ErrorCode as Long
之后设置名为' do something
的公共字段
我使用过很多工业控制API,并且已经使用了这两种方法。
答案 2 :(得分:0)
只要引发错误的函数没有(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
答案 3 :(得分:0)
如果您只是想将错误传递回原始调用者而不处理它,那么您希望删除子函数中的任何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