如何将错误传递回调用函数?

时间:2013-01-15 22:36:00

标签: vb6 error-handling

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

4 个答案:

答案 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.NumberErr.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?

How to clean up error handling in a function?

答案 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