MyTetra Share
Делитесь знаниями!
[VB6] Создание обработчика ошибок
Время создания: 31.07.2019 23:23
Текстовые метки: Обработка ошибок, On Error Goto, VBA, Error, ошибки
Раздел: Разные закладки - VBA - VBA управление кодами - Ошибки-глюки
Запись: xintrea/mytetra_db_adgaver_new/master/base/1514658598peo0xr0q25/text.html на raw.githubusercontent.com

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

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

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

Отфильтровать:

Код

Описание

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

Showing 1 to 87 of 87 entries

 

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

 
MyTetra Share v.0.65
Яндекс индекс цитирования