Exit Sub
Err:
Dim errorNumber As Long
errorNumber = Err.Number
On Error GoTo 0
If errorNumber = LowPower Then
SwitchToUPS '不会出错
Else
Err.Raise errorNumber
End If
End Sub
sub1(原来的func1)代码:
'我是以前的sub1
Public Sub sub1()
On Error GoTo Err
Call sub2
CompleteTheMission '这里可能会发生运行时刻错误
Exit Sub
Err:
Dim errorNumber As Long
errorNumber = Err.Number
On Error GoTo 0
Select Case errorNumber
Case InsufficientMemory
BuyNewDisk "120G" '不会出错
ChangeDisk "120G" '不会出错
Case WriteDiskError
BuyMemory "512M" '不会出错
AppendMemory "512M" '不会出错
Case Else
MsgBox "搞不定了,您老看着办吧"
End Select
End Sub
func3位于调用序列的最底层的,它捕获所有的运行时刻错误。但是由于它没有足够的信息来处理这些错误,就把错误转换为相应的返回值:
Public Function func3() As Long
On Error GoTo Err
Call DoSomeThing '这里可能会发生运行时刻错误
func3 = 0 '成功退出
Exit Function
Err:
Select Case Err.Number
Case InsufficientMemory
func3 = -1 '出错
Case WriteDiskError
func3 = -2 '出错
Case LowPower
func3 = -3 '又出错
End Select
On Error GoTo 0
End Function
func2接受func3的返回值,并且能够处理其中一部分错误,剩下的错误它没有办法解决,就返回给它的调用方,另外它也无法处理所有它捕获到的运行时刻错误,也转换为返回值一并返回
Public Function func2() As Long
Dim result As Long
result = func3
If 0 = result Then
On Error GoTo Err
Call GoOnDoingTheRest '这里可能会发生运行时刻错误
func2 = 0
ElseIf -3 = result Then
Call SwitchToUPS '不会出错
Else
func2 = result
End If
Exit Function
Err:
func2 = -4
On Error GoTo 0
End Function
func1是调用序列中的最后一个,它要处理掉前面处理不了的错误,同样的,它也要捕获所有的运行时刻错误。它罩不住的时候,就丢给用户
Public Sub sub1()
Dim result As Long
result = func2
If 0 = result Then
On Error GoTo Err
CompleteTheMission '这里可能会发生运行时刻错误
ElseIf -2 = result Then
BuyNewDisk "120G" '不会出错
ChangeDisk "120G" '不会出错
ElseIf -1 = result Then
BuyMemory "512M" '不会出错
AppendMemory "512M" '不会出错
Else
MsgBox "搞不定了,您老看着办吧"
End If
Exit Sub
Err:
On Error GoTo 0
MsgBox "搞不定了,您老看着办吧"
End Sub