与Err.Raise的反思错误

信息:感谢加里·麦吉尔,我可以改善我的问题的源代码。

在我目前的项目中,我有一个处理所有错误的子。 以下情况应该发生:

  1. 开始小组
  2. 发电子邮件
  3. 显示默认的Debug-Error窗口(点击“Debug”时指向原来的错误行)

这里的要点是找出错误发生在哪一行

Private Sub Foo() On Error GoTo ErrorHandling a = 7 / 0 Exit Sub ErrorHandling: errorNumber = Err.Number errorSource = Err.Source errorDescription = Err.Description errorHelpFile = Err.HelpFile errorHelpContext = Err.HelpContext On Error GoTo 0 Call HandleError(errorNumber, errorSource, errorDescription, errorHelpFile, errorHelpContext) End Sub Public Sub HandleError(errorNumber As Integer, errorSource As String, errorDescription As String, errorHelpFile As String, errorHelpContext As String) Call SendMail(subject, body, mail) Err.Raise errorNumber, errorSource, errorDescription, errorHelpFile, errorHelpContext End Sub 

但是,如果我这样做,新创build的错误窗口只是指向Err.Raise行,而不是错误发生的实际行。 由于我的公司限制不允许插件,所以用插件编号是没有解决办法的。

还有其他可能的解决scheme吗?

编辑

所以代替这个 ,应该突出显示a = 7 / 0的行

编辑2

可悲的是,这是行不通的:

 Private Sub Foo() On Error GoTo ErrorHandling a = 7 / 0 Exit Sub ErrorHandling: ... Call HandleError(...) GoTo 0 End Sub 

(最初)发布的代码有几个问题:

  1. HandleErrorOn Error Goto 0将清除Err.Number等的值。所有On Error变体都会有效地执行Err.Clear 。 您可以尝试在function开始时保存这些值以备后用。
  2. 看起来你对HandleError的调用会引发一个错误,而这个错误又会被处理,然后再次进入你的ErrorHandlingerror handling程序,这只会循环? 所以实际上,您可能需要捕获error handling程序中的各种错误值,然后禁用error handling程序,然后将它们作为parameter passing给HandleError函数。 也许这样的事情:

 Public Sub Foo() On Error Goto ErrorHandling number = 7/0 Exit Sub ErrorHandling: errorNumber = Err.Number errorSource = Err.Source errorDescription = Err.Description errorHelpFile = Err.HelpFile errorHelpContext = Err.HelpContext On Error Goto 0 Call HandleError(errorNumber, errorSource, errorDescription, errorHelpFile, errorHelpContext) End Sub Public Sub HandleError(errorNumber As Integer, errorSource As String, errorDescription As String, errorHelpFile As String, errorHelpContext As String) Call SendMail(subject, body, mail) Err.Raise errorNumber, errorSource, errorDescription, errorHelpFile, errorHelpContext End Sub 

我没有尝试过,但它看起来可能工作。

您可以使用“ Stop和“ Resume返回到发生错误的行,但不能在生产代码中使用此行。 这样做会停止代码的运行,然后你可以使用F8来进入下一行代码,这将返回到引发错误的行。

  Private Sub Foo() On Error GoTo ErrorHandling a = 7 / 0 Exit Sub ErrorHandling: errorNumber = Err.Number errorSource = Err.Source errorDescription = Err.Description errorHelpFile = Err.HelpFile errorHelpContext = Err.HelpContext HandleError errorNumber, errorSource, errorDescription, errorHelpFile, errorHelpContext Stop Resume End Sub Public Sub HandleError(errorNumber As Integer, errorSource As String, errorDescription As String, errorHelpFile As String, errorHelpContext As String) Call SendMail(Subject, body, mail) End Sub 

如果你需要的东西,将提供生产代码的错误报告,我不相信有一种方法来返回抛出错误的行,没有编号的行和使用Erl 。 另一种方法是使用有意义的代码来实现自己的错误,这样可以识别代码的哪一部分导致错误。

如果你在VBA中使用error handling,并且想要得到运行时错误发生的那一行,那么你需要Erl(),为此你需要行号,简单明了。

由于我的公司限制不允许插件,所以用插件编号是没有解决办法的。

你应该真的要求他们重新考虑这个政策。 不使用MZ-Tools编程VBA并不好玩,单独使用全局search和过程调用函数是无价的。

当然你在开发时没有行号,在代码投入生产时添加它们。