Каков лучший способ обработки ошибок в VB6

У меня есть приложение VB6, я хочу добавить в него хорошую обработку ошибок, которая может сказать мне, что было ошибкой и точным местом, когда это произошло, может ли кто-нибудь предложить хороший способ сделать это?

Ответы

Ответ 1

ON ERROR GOTO

и

Err

объект.

Существует учебник здесь.

Ответ 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 (один из многих его недостатков), и действительно это нужно использовать только для поиска неожиданных ошибок. Если вы знаете, что если есть вероятность возникновения ошибки в определенной ситуации, вы должны поймать эту конкретную ошибку и обработать ее. Если вы знаете, что ошибка, возникающая в определенном разделе, приведет к нестабильности (File IO, Memory Issues и т.д.), Предупредите пользователя и узнайте, что вы находитесь в "неизвестном состоянии" и что, вероятно, происходят "плохие вещи". Очевидно, используйте дружественные условия, чтобы информировать пользователя, но не напуганы.

Ответ 3

простой способ без дополнительных модулей, полезных для модулей класса:

предустановить каждую функцию /subs:

On Error Goto Handler

Обработчик/bubbleup:

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

voila, трассировка стека гетто.

Ответ 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

Повторение ошибки так же просто, как вызов Error.Reraise с новым источником.

Хотя можно получить параметры Source и Procedure из стека вызовов, если вы компилируете с символической информацией об отладке, он недостаточно надежный для использования в производственных приложениях

Ответ 5

Использовать на

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

Ответ 6

Да, возьмите совет Криса и получите MZTools.

Вы можете добавить номера строк для отсечения областей сложных процедур, которые ERL будет сообщать в обработчике ошибок, чтобы отслеживать, какая область вызывает ошибку.

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

Ответ 7

Используйте оператор On Error и объект Err.