что лучший путь состоит в том, чтобы обработать ошибки в VB6

Все исправлено в последней версии! Просто обновитесь до v1.2.1. Мы добавим интеграционный тест, чтобы покрыть этот слой, чтобы избежать будущих проблем.

Ура!

15
задан Onorio Catenacci 22 September 2008 в 17:36
поделиться

6 ответов

НА ОШИБКЕ GOTO

и

Err

объект.

существует учебное руководство здесь .

3
ответ дан 1 December 2019 в 00:21
поделиться

В первую очередь, пойдите, добираются 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, Проблемы памяти, и т.д.) предупреждают пользователя и знают, что Вы находитесь в "неизвестном состоянии" и что "плохие дела", вероятно, идут, происходят. Очевидно, используйте дружественные термины для информирования пользователя, но не напуганные.

29
ответ дан 1 December 2019 в 00:21
поделиться

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

предвосхищают каждую функцию/нижние индексы:

On Error Goto Handler

handler/bubbleup:

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

вуаля, отслеживание стека гетто.

12
ответ дан 1 December 2019 в 00:21
поделиться

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

4
ответ дан 1 December 2019 в 00:21
поделиться

Да, послушайте совет Kris и получите MZTools.

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

10
    ...group of statements
20
    ...group of statements
30
    ...and so on
1
ответ дан 1 December 2019 в 00:21
поделиться

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

0
ответ дан 1 December 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: