VB6中的集中错误处理

Ang*_*ker 4 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
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*oss 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所提到的,您可以为ToError函数添加其他参数,一个参数用于Err您需要访问的对象的每个属性.

Public Function ToError( _
   ByVal strErrSource As String, _
   ByVal nErrNumber As Long, _
   ByVal sErrDescription As String, _
   ByVal nLineNumber As Long) As String
Run Code Online (Sandbox Code Playgroud)

用法示例

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

ToError Err.Source, Err.Number, Err.Description, Erl 
Run Code Online (Sandbox Code Playgroud)

如果你也想要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
   '...
Run Code Online (Sandbox Code Playgroud)

示例用法

ToError Err, Erl
Run Code Online (Sandbox Code Playgroud)


Zia*_*hoy 2

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