Вопрос

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

Это было полезно?

Решение

ПРИ ОШИБКЕ ПЕРЕЙТИ

и

Err

объект.

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

Другие советы

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

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

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

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

Да, прислушайтесь к совету Криса и приобретите MZTools.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top