Получение более полезного / точного сообщения об ошибке - PullRequest
0 голосов
/ 17 октября 2018

У нас есть проблема с клиентским интерфейсом Access, который кажется случайным, но постоянно истекает временем ожидания пользователей без объяснения причин.Это давняя проблема, каждый раз, когда происходит отключение, мы получаем вспомогательный модуль, который вызывает проблему, и общее сообщение об ошибке.

Я начинаю думать, что сообщение об ошибке вводит в заблуждение, оновыдает общий «Отказ соединения» с кодом ошибки 0. После поиска в Google кода, который, по-видимому, означает, что ошибки не произошло?

Я использую C #, а не VBA, поэтому я не знаком с ним, но обработка ошибокследует:

    Private Sub Form_Timer()

    Dim blnSystemMaintenance As Boolean

    On Error GoTo ErrHand

    ' Check for System Maintenance.
    blnSystemMaintenance = DLookup("SystemMaintenance", "ConfigItems")
    If blnSystemMaintenance Then

    //Do stuff
        Else
    //Do stuff
        End If

    //Do stuff

    End If

    ErrExit:
        Exit Sub
        Resume
    ErrHand:
    '    If Err.Number = 1 Then

    '    Else
            MsgBox "Error number: " & Err.Number & vbCrLf & _
           "Error description: " & Err.Description, vbCritical, _
           "Unexpected Error Occurred in Sub: Form_Timer"
    Resume ErrExit
    '    End If


    End Sub

Есть ли способ получить более полезное сообщение об ошибке?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Иногда сообщения об ошибках могут вводить в заблуждение для некоторых типов функций, таких как DLookup, это системная проблема, но иногда сообщения об ошибках вводят в заблуждение, потому что не все процедуры имеют правильные обработчики ошибок, и трудно локализовать проблему, особенно если разработчикне имеет прямого доступа к приложению.Таким образом, правильные обработчики ошибок могут значительно упростить устранение неполадок.

Обычно я использую два типа обработчиков ошибок, которые дают мне довольно четкие диагностические сообщения.Наиболее распространенный - обычный обработчик ошибок для процедур, которые могут взаимодействовать с пользователем и обычно вызываемые системой - обработчики событий:

Private Sub Frame2_Click()
    On Error GoTo ErrorHandler
    'code here
ExitHere:
    On Error Resume Next
    Exit Sub
    Resume '>> remove in release
ErrorHandler:
    MsgBox "Error " & err.Number & " (" & err.Description & "), Line " & Erl & " in procedure Frame2_Click of Form_Form1", vbExclamation + vbMsgBoxHelpButton, "Error " & Now()
    Resume ExitHere
End Sub

Второй тип обработчиков - для процедур, которые могут вызываться только другимиПроцедуры VBA, обработчик «пузыря», который добавляет информацию об ошибке в описание ошибки и передает ошибку процедуре вызывающей стороны:

Sub MySub()
    On Error GoTo ErrorHandler
    'code here
ExitHere:
    Exit Sub
    Resume '>> remove in release
ErrorHandler:
    Debug.Assert Not (STOP_AT_ERROR And IS_DEV) '>> remove in release
    err.Raise err.Number, "MySub of Form_Form1", err.Description & vbCrLf & "in MySub of Form_Form1 at " & Erl
End Sub

Позволяет показать полный стек вызовов со строками ошибок и именами процедур.Номера строк должны быть добавлены к каждой строке кода.

Для упрощения отладки я использую две константы: если STOP_AT_ERROR равно True и IS_DEV равно True, выполнение кода прекращается сразу после ошибки без всплывающих окон и позволяет проверять переменные.Для проверки я перемещаю указатель выполнения кода в строку Resume с помощью Ctrl-F9, затем нажимаю F8 и указатель кода перемещается в строку, что вызвало ошибку.

В рабочей или QA-версиях просто изменитеIS_DEV до False и код не остановится на строке Debug.Assert.

Для автоматической генерации обработчиков ошибок и добавления номеров строк я использую стороннее программное обеспечение, например, MZ-Tools.Это можно сделать вручную, но это довольно много времени

0 голосов
/ 17 октября 2018

Доменные агрегаты часто не дают описательных сообщений об ошибках.Я предполагаю, что ваша база данных сталкивается с проблемами при подключении к бэкенду при запуске агрегата домена.

Вы можете легко заменить агрегат вашего домена вызовом набора записей:

blnSystemMaintenance = CurrentDb.OpenRecordset("SELECT SystemMaintenance FROM ConfigItems")(0).Value

Часто такиенемного больше описательных ошибок, если ошибка вообще возникает при использовании набора записей.

...