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

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
8,015
Решения
12
Реакции
6,785
Ошибками пользуются в любой нормально написанной программе,
вне зависимости от объема ее кода.

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

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

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