我有以下所有错误处理程序调用的方法: 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 _ ", Pr
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’语句清除错误?
On Error语句将始终清除Err变量(Erl也将重置为0).从理论上讲,这意味着您可以通过移动ToString = …行下面的On Error语句(或完全删除ToError函数中的错误处理程序)来解决问题,但遗憾的是,它不一定总是有效.项目引用的每个组件(DLL,ActiveX EXE等)基本上都在内存中获得自己的Err实例.因此,如果您的MainApp.exe引发了传递给ToError的错误(例如驻留在单独的ErrorHandling.dll中),则DLL将不会看到您的EXE看到的Err变量.它们每个都有自己的私有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将等于定义ToError方法的项目的App.Title,而不是引发错误的组件.如果ToError位于不同的项目中,这一点很重要.
方法2
通过将Err对象本身作为参数传递给函数,可以使ToError调用更简洁一些,但是在这种情况下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