我有一个VB6应用程序,我想在其中添加一些良好的错误处理功能,以便告知我出现错误的具体位置和原因,请问有什么好的方法可以实现这个功能?
我有一个VB6应用程序,我想在其中添加一些良好的错误处理功能,以便告知我出现错误的具体位置和原因,请问有什么好的方法可以实现这个功能?
On Error GoTo {PROCEDURE_NAME}_Error
{PROCEDURE_BODY}
On Error GoTo 0
Exit {PROCEDURE_TYPE}
{PROCEDURE_NAME}_Error:
LogError "Error " & Err.Number & " (" & Err.Description & ") in line " & Erl & _
", in procedure {PROCEDURE_NAME} of {MODULE_TYPE} {MODULE_NAME}"
一种不需要额外模块的简单方法,适用于类模块:
在每个函数/子程序之前进行预处理:
On Error Goto Handler
处理程序/向上冒泡:
Handler:
Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description
看吧,小区堆栈跟踪。
我使用自己编写的 Error.bas
模块,使得报告和重新抛出错误变得更加简便。
以下是它的内容(由于篇幅原因进行了编辑):
Option Explicit
Public Sub ReportFrom(Source As Variant, Optional Procedure As String)
If Err.Number Then
'Backup Error Contents'
Dim ErrNumber As Long: ErrNumber = Err.Number
Dim ErrSource As String: ErrSource = Err.Source
Dim ErrDescription As String: ErrDescription = Err.Description
Dim ErrHelpFile As String: ErrHelpFile = Err.HelpFile
Dim ErrHelpContext As Long: ErrHelpContext = Err.HelpContext
Dim ErrLastDllError As Long: ErrLastDllError = Err.LastDllError
On Error Resume Next
'Retrieve Source Name'
Dim SourceName As String
If VarType(Source) = vbObject Then
SourceName = TypeName(Source)
Else
SourceName = CStr(Source)
End If
If LenB(Procedure) Then
SourceName = SourceName & "." & Procedure
End If
Err.Clear
'Do your normal error reporting including logging, etc'
MsgBox "Error " & CStr(ErrNumber) & vbLf & "Source: " & ErrSource & vbCrLf & "Procedure: " & SourceName & vbLf & "Description: " & ErrDescription & vbLf & "Last DLL Error: " & Hex$(ErrLastDllError)
'Report failure in logging'
If Err.Number Then
MsgBox "Additionally, the error failed to be logged properly"
Err.Clear
End If
End If
End Sub
Public Sub Reraise(Optional ByVal NewSource As String)
If LenB(NewSource) Then
NewSource = NewSource & " -> " & Err.Source
Else
NewSource = Err.Source
End If
Err.Raise Err.Number, NewSource, Err.Description, Err.HelpFile, Err.HelpContext
End Sub
报告错误非常简单:
Public Sub Form_Load()
On Error Goto HError
MsgBox 1/0
Exit Sub
HError:
Error.ReportFrom Me, "Form_Load"
End Sub
Error.Reraise
即可。Source
和Procedure
参数,但这不足以在生产应用程序中使用。dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"
是的,请听从Kris的建议并获取MZTools。
您可以添加行号以划分复杂过程的区域,ERL将在错误处理程序中报告它们,以跟踪导致错误的区域。
10
...group of statements
20
...group of statements
30
...and so on