我有以下所有错误处理程序调用的方法:
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'语句清除错误?
答案 0 :(得分:6)
On Error
语句将始终清除Err
变量(Erl
也将重置为0)。从理论上讲,这意味着您可以通过移动On Error
行下方的ToString = ...
语句(或完全删除ToError
函数中的错误处理程序)来解决问题,但不幸的是,这不一定总是工作。
项目引用的每个组件(DLL,ActiveX EXE等)实际上都在内存中获得了自己的Err
实例。因此,如果您的MainApp.exe
引发了传递给ToError
的错误(例如,驻留在单独的ErrorHandling.dll
中),则DLL将看不到您的Err
变量EXE看到了。它们每个都有自己的私有Err
变量。
我能想到的问题至少有两种解决方法:
作为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
位于不同的项目中,这一点很重要。
通过将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