VB6错误传播

时间:2009-09-04 02:35:46

标签: vb6 error-handling

我在我的主调用过程中使用了一个错误处理程序,并让其他过程只是汇总到该错误处理程序。

我每次都应该清除错误吗?或者我应该退出Sub而不是让错误处理程序继续在End Sub?

我问,因为我读过我可能会收到第一个错误,然后其他错误将无法处理。

很抱歉,如果这不是很清楚的话。不太确定我在说什么。

谢谢!

编辑:这样的事情。这有必要吗?

Public Sub SubA()
On Error Goto ProcError

  ' other code  
  MsgBox FuncA()

ProcExit:  
  Exit Sub

ProcError:  
  MsgBox Err.Description  
  Resume ProcExit
End Sub

3 个答案:

答案 0 :(得分:2)

OP:我每次都应该清除错误吗?或者我应该退出Sub而不是让错误处理程序继续在End Sub?

清除错误是什么意思?
通常,程序以这种方式编写

public sub myProcedure()
on error goto e:
'statements that could raise error
exit sub

e:
Log err.Number, err.Description, "error occurred in myProcedure"
end sub

OR

您可以选择不添加错误处理程序。在这种情况下,错误将传播给调用者(或处理它的过程)。

请发布您想要实现的示例代码&你的期望。

编辑:以下是您发布的代码的含义

Public Sub SubA()
On Error Goto ProcError

  ' other code  
  MsgBox FuncA()
exit sub   'put exit sub otherwise it will execute the line below, even if no error

ProcExit:  
'this statement will get executed after the error msgbox is shown
msgbox "Reached ProcExit"
Exit Sub

ProcError:  
MsgBox Err.Description  'catch the error and show the msgbox
'error is cleared the point it reaches ProcError
'Resume ProcExit acts as goto, to execute any statements after the error is handled
Resume ProcExit 
End Sub

答案 1 :(得分:1)

使用您的特定示例,您不需要清除错误,因为您的模式基于捕获错误。虽然没有伤害:

ProcExit:  
  Exit Sub

ProcError:  
  MsgBox Err.Description  
  Err.Clear
  Resume ProcExit

现在,如果你有一个模式,你检查错误而不是捕获它们,那么是的,你必须清除它。这是一个小例子:

On Error Resume Next
Dim o as Object

Set o = myCollection(someKey)

if Err.Number <> 0 then
   ... respond to error
   Err.Clear

我希望这会有所帮助。

答案 2 :(得分:1)

每当您按预期退出Sub时,Err对象都会被清除(例如,不会发生错误)。在您的示例中,Resume ProcExit语句是不必要的。以下两个子行为的行为方式相同:

Public Sub SubA()
  On Error Goto ProcError
  MsgBox FuncA()
ProcExit:  
  Exit Sub
ProcError:  
  MsgBox Err.Description  
  Resume ProcExit
End Sub

Public Sub SubA()
  On Error Goto ProcError
  MsgBox FuncA()
  Exit Sub
ProcError:  
  MsgBox Err.Description  
End Sub

您不必使用Exit Sub语句来清除Err对象。当你点击End Sub时,只是从子上掉下来就会产生同样的影响。

如果您希望“其他过程”中的错误“汇总”(更好的词是传播)到主调用过程的错误处理程序,它们根本不应包含错误处理程序。例如,假设Main调用SubA,SubA调用FuncA。 FuncA中发生错误。如果您通过简单地显示一个消息框来处理FuncA中的错误,就像您在示例中所做的那样,代码将继续在SubA中执行,但是由于FuncA中出现问题并且SubA不知道,因此将处于不稳定状态它

一种选择是避免在SubA和FuncA中放置错误处理程序。当FuncA中发生错误时,它会被提升到SubA,然后SubA将其提升到Main,然后正确处理它。

更好的选择是捕获错误,记录错误,然后重新提升它们。然后当错误最终通过错误处理程序进入您的Main Sub时,您将获得更多信息。