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

Тема в разделе "Изучение основ языка", создана пользователем Dragokas, 26 авг 2015.

  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Ошибками пользуются в любой нормально написанной программе,
    вне зависимости от объема ее кода.

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

    Для этого в идеале, в каждой из функций следует использовать обработчик ошибок (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:

    Код Описание
    1 3 Return without GoSub
    2 5 Invalid procedure call or argument
    3 6 Overflow
    4 7 Out of memory
    5 9 Subscript out of range
    6 10 This array is fixed or temporarily locked
    7 11 Division by zero
    8 13 Type mismatch
    9 14 Out of string space
    10 16 Expression too complex
    11 17 Can't perform requested operation
    12 18 User interrupt occurred
    13 20 Resume without error
    14 28 Out of stack space
    15 35 Sub or Function not defined
    16 47 Too many DLL application clients
    17 48 Error in loading DLL
    18 49 Bad DLL calling convention
    19 51 Internal error
    20 52 Bad file name or number
    21 53 File not found
    22 54 Bad file mode
    23 55 File already open
    24 57 Device I/O error
    25 58 File already exists
    26 59 Bad record length
    27 61 Disk full
    28 62 Input past end of file
    29 63 Bad record number
    30 67 Too many files
    31 68 Device unavailable
    32 70 Permission denied
    33 71 Disk not ready
    34 74 Can't rename with different drive
    35 75 Path/File access error
    36 76 Path not found
    37 91 Object variable or With block variable not set
    38 92 For loop not initialized
    39 93 Invalid pattern string
    40 94 Invalid use of Null
    41 96 Unable to sink events of object because the object is already firing events to the maximum number of event receivers that it supports
    42 97 Can not call friend function on object which is not an instance of defining class
    43 98 A property or method call cannot include a reference to a private object, either as an argument or as a return value
    44 321 Invalid file format
    45 322 Can't create necessary temporary file
    46 325 Invalid format in resource file
    47 380 Invalid property value
    48 381 Invalid property array index
    49 382 Set not supported at runtime
    50 383 Set not supported (read-only property)
    51 385 Need property array index
    52 387 Set not permitted
    53 393 Get not supported at runtime
    54 394 Get not supported (write-only property)
    55 422 Property not found
    56 423 Property or method not found
    57 424 Object required
    58 429 ActiveX component can't create object
    59 430 Class does not support Automation or does not support expected interface
    60 432 File name or class name not found during Automation operation
    61 438 Object doesn't support this property or method
    62 440 Automation error
    63 442 Connection to type library or object library for remote process has been lost. Press OK for dialog to remove reference.
    64 443 Automation object does not have a default value
    65 445 Object doesn't support this action
    66 446 Object doesn't support named arguments
    67 447 Object doesn't support current locale setting
    68 448 Named argument not found
    69 449 Argument not optional
    70 450 Wrong number of arguments or invalid property assignment
    71 451 Property let procedure not defined and property get procedure did not return an object
    72 452 Invalid ordinal
    73 453 Specified DLL function not found
    74 454 Code resource not found
    75 455 Code resource lock error
    76 457 This key is already associated with an element of this collection
    77 458 Variable uses an Automation type not supported in Visual Basic
    78 459 Object or class does not support the set of events
    79 460 Invalid clipboard format
    80 461 Method or data member not found
    81 462 The remote server machine does not exist or is unavailable
    82 463 Class not registered on local machine
    83 481 Invalid picture
    84 482 Printer error
    85 735 Can't save file to TEMP
    86 744 Search text not found
    87 746 Replacements too long
     
    Последнее редактирование: 26 авг 2015
    akok, orderman, Kиpилл и ещё 1-му нравится это.

Поделиться этой страницей