VB6中的集中错误处理

时间:2010-03-29 23:46:58

标签: vb6 error-handling

我有以下所有错误处理程序调用的方法:

Public Function ToError(strClass As String, strMethod As String) As String

    On Error GoTo errHandle

    ToError = "Err " & Err.Number & _
                      ", Src: " & Err.Source & _
                      ", Dsc: " & Err.Description & _
                      ", Project: " & App.Title & _
                      ", Class: " & strClass & _
                      ", Method: " & strMethod & _
                      ", Line: " & Erl

    Err.Clear

exitPoint:
   Exit Function

errHandle:
   oLog.AddToLog "Error in ToError Method: " & Err.Description, False
   Resume exitPoint
End Function

事实证明,因为我在这个函数On Error GoTo errHandle中声明了一个错误处理程序,VB6在我能够记录它之前清除错误。

有没有办法阻止'On Error GoTo errHandle'语句清除错误?

4 个答案:

答案 0 :(得分:6)

On Error语句将始终清除Err变量(Erl也将重置为0)。从理论上讲,这意味着您可以通过移动On Error行下方的ToString = ...语句(或完全删除ToError函数中的错误处理程序)来解决问题,但不幸的是,这不一定总是工作。

项目引用的每个组件(DLL,ActiveX EXE等)实际上都在内存中获得了自己的Err实例。因此,如果您的MainApp.exe引发了传递给ToError的错误(例如,驻留在单独的ErrorHandling.dll中),则DLL将看不到您的Err变量EXE看到了。它们每个都有自己的私有Err变量。

我能想到的问题至少有两种解决方法:

方法1

作为Zian Choy mentions,您可以向ToError函数添加其他参数,每个参数对应您需要访问的Err对象的每个属性。

<强>代码

Public Function ToError( _
   ByVal strErrSource As String, _
   ByVal nErrNumber As Long, _
   ByVal sErrDescription As String, _
   ByVal nLineNumber As Long) As String

使用示例

然后你必须从你的错误处理程序中调用这样的方法,从当前Err对象传递所有相关值,以及Erl

ToError Err.Source, Err.Number, Err.Description, Erl 

如果您还想要App.Title,那么您还需要为ToError添加一个额外的参数,因为App.Title将等于App.Title定义ToError方法的项目,而不是引发错误的组件。如果ToError位于不同的项目中,这一点很重要。

方法2

通过将ToError对象本身作为参数传递给函数,可以使Err调用更简洁一些,但是ToError函数在这种情况下应该做的第一件事会立即存储您需要的所有相关属性的副本,因为后续On Error语句将清除该变量。

<强>代码

Public Function ToError(ByVal oError As ErrObject, ByVal nLineNumber As Long) As String

   'Copy the important Err properties first, '
   'before doing anything else...            '

   Dim strErrSource As String
   Dim nErrNumber As Long
   Dim strErrDescription As String

   strErrSource = oError.Source
   nErrNumber = oError.Number
   strErrDescription = oError.Description

   On Error Goto errHandle

   'More code here
   '...

使用示例

ToError Err, Erl

答案 1 :(得分:2)

您可以通过将Err对象的值作为参数传递给ToError来解决问题。

答案 2 :(得分:1)

无法阻止On Error清除错误。

  • 您可以从ToError中删除错误处理。它太短而且乏味,不太可能遇到错误。
  • 重构错误处理可能会更好,以便此ToError代码在通用错误报告例程中内联,该例程执行日志记录或任​​何需要的操作。然后使用Mike's answer中的技巧。

BTW如果有人在阅读此内容时手动添加错误处理程序,请停止正在执行的操作并立即获取免费的MZ-Tools包。

答案 3 :(得分:0)

您可以创建如下的用户定义类型

Private Type TempErrObj
    ErrNumber As Integer
    ErrSource As String
    ErrDescription As String
End Type

稍后修改ToError功能如下:

Public Function ToError() As String
    Dim iTempErr As TempErrObj
    iTempErr.ErrNumber = Err.Number
    iTempErr.ErrSource = Err.Number
    iTempErr.ErrDescription = Err.Description
    On Error GoTo errHandle

    ToError = "Err " & iTempErr.ErrNumber & _
                      ", Src: " & iTempErr.ErrSource & _
                      ", Dsc: " & iTempErr.ErrDescription & _
                      ", Project: " & App.Title & _
                      ", Line: " & Erl
    Err.Clear

exitPoint:
   Exit Function

errHandle:
    oLog.AddToLog "Error in ToError Method: " & Err.Description, False
   Resume exitPoint
End Function