什么是更好的方式来处理VB6的错误(what is the better way to handle

2019-06-17 13:22发布

我有VB6应用程序,我想提出一些好的错误处理finction它可以告诉我什么是错误和确切地点当它发生时,任何人都可以提出好的办法做到这一点

Answer 1:

ON ERROR GOTO

Err

宾语。

有一个教程在这里 。



Answer 2:

首先,去获得MZTools为Visual Basic 6 ,它的免费和无价的。 第二加(是的,每一个功能)上的功能自定义错误处理程序。 我们使用的错误处理程序看起来是这样的:

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}"

然后创建一个错误记录到光盘一LOGERROR功能。 接下来,您发布的代码中添加行号之前,所有的功能(这也内置到MZTools)。 从现在开始,你会知道从错误日志所发生的一切。 如果可能的话,还上传了错误日志,实际上从现场检查他们住。

这是关于您可以在VB6意外全局错误处理(其众多缺陷之一)做的最好的,真是这应该只被用来找到意外的错误。 如果你知道,如果在一定的情况下发生的错误的可能性,你应该抓住那个特定的错误以及处理它。 如果你知道,在某一段出现的错误会导致不稳定(文件IO,内存问题等)向用户发出警告,并知道你是在一个“未知状态”和“不好的事情”可能会发生。 显然,使用友好的关系,以使用户了解,但并不害怕。



Answer 3:

一个简单的方法而无需额外的模块,为类模块有用:

抢先每个功能/潜艇:

On Error Goto Handler

交易/ bubbleup:

Handler:
  Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description

瞧,贫民区堆栈跟踪。



Answer 4:

我使用的是本土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

Reraising错误是调用简单Error.Reraise新来源。

虽然可以检索SourceProcedure ,如果你用符号调试信息编译从调用栈参数,它不是足够可靠的生产应用程序中使用



Answer 5:

是的,采取克里斯的建议,并得到MZTools。

您可以添加行号部分关闭的复杂程序,ERL将在错误处理程序报区,追查哪个区域导致错误。

10
    ...group of statements
20
    ...group of statements
30
    ...and so on


Answer 6:

使用上

dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"


Answer 7:

使用On Error语句和Err对象。



文章来源: what is the better way to handle errors in VB6