Как лучше обрабатывать ошибки в VB6? - PullRequest
14 голосов
/ 22 сентября 2008

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

Ответы [ 7 ]

29 голосов
/ 22 сентября 2008

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

12 голосов
/ 22 сентября 2008

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

упреждать каждую функцию / подпрограммы:

On Error Goto Handler

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

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

вуаля, след стека гетто.

4 голосов
/ 24 сентября 2008

Я использую доморощенный модуль 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 из стека вызовов, если вы компилируете с символьной информацией отладки, это недостаточно надежно для использования в производственных приложениях

2 голосов
/ 22 сентября 2008

ON ERROR GOTO

и

Err

объект.

Здесь есть учебник .

1 голос
/ 24 августа 2016

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

dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"
1 голос
/ 22 сентября 2008

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

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

10
    ...group of statements
20
    ...group of statements
30
    ...and so on
0 голосов
/ 22 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...