• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

[VB6] Создание обработчика ошибок

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#1
Ошибками пользуются в любой нормально написанной программе,
вне зависимости от объема ее кода.

Это помогает проанализировать, правильно ли работает программа.
И если нет, минимальными усилиями узнать причину проблемы.

Для этого в идеале, в каждой из функций следует использовать обработчик ошибок (On Error Goto).
А там, где используются API-функции, каждую из них проверять на предмет возвращаемого значения, а также кода ошибки API-функции (Err.LastDllError).
Это позволит минимизировать затраты на отладку программы
и еще на этапе проектирования исключить некоторые наиболее вероятные ошибки в вызове функций.

Внутреннюю ошибку VB можно также симмитировать вручную с помощью вызова процедуры Err.Raise [Номер ошибки]
Это спровоцирует переход к метке обработчика ошибок, указанной в директиве On Error Goto Имя_Метки
Это иногда полезно, если Вы хотите ввести в программу собственные ошибки (выход из функции при возникновении, на Ваш взгляд, критической ситуации).

Номер внутренней ошибки также можно очистить методом Err.Clear
Обработчик ошибок в любой момент можно отключить, вернув стандартное поведение программы, с помощью директивы On Error Goto 0
В этом случае, если произойдет ошибка, программа прекратит свое выполнение и выведет ошибку и краткое описание в стандартном диалоговом окне (msgbox)*
* Кроме случаев, когда обработчик ошибок установлен в родительской функции (вниз по стеку вызовов), т.е. функции, которая вызвала эту функцию. В этом случае будет вызван именно её обработчик, а программа продолжит свое выполнение.

При возникновении внутренней ошибки, ее номер и описание можно получить через свойства Number и Description объекта Err.
Стандартный обработчик ошибок VB имеет такой вид:

VB.NET:
Function foo()
    On Error Goto ErrorHandler

    ' ... тело функции

    if {что-то можем проверить} then
        ' здесь, если нам нужно, можем вызвать ошибку самостоятельно
        err.Raise 51   'Internal error
    end if

    Exit function
ErrorHandler:
    'обработчик
    'выводим номер внутренней ошибки, краткое описание, номер ошибки API-функции
    Debug.? "Error: " & Err.Number & ". " & Err.Description & ". LastDllErr: " & Err.LastDllError
End function

Описание ошибки API-функции (или COM-объекта) можем получить с помощью такой функции:

VB.NET:
Private Declare Function FormatMessage Lib "kernel32.dll" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) As Long

Const MAX_PATH As Long = 260&

Public Function MessageText(lCode As Long) As String
    On Error goto ErrorHandler
    Const FORMAT_MESSAGE_FROM_SYSTEM    As Long = &H1000&
    Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200

    Dim sRtrnCode   As String
    Dim lRet        As Long

    sRtrnCode = Space$(MAX_PATH)
    lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, ByVal 0&, lCode, ByVal 0&, sRtrnCode, MAX_PATH, ByVal 0&)
    If lRet > 0 Then
        MessageText = Left$(sRtrnCode, lRet)
        MessageText = Replace$(MessageText, vbCrLf, vbNullString)
    End If
  Exit function
ErrorHandler:
  Debug.? "Error: " & Err.Number & ". " & Err.Description & ". LastDllErr: " & Err.LastDllError
End Function

Список внутренних ошибок VB6:

 
Последнее редактирование: