Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Служба Рассылок Городского Кота


Служба Рассылок Городского Кота
VB Хитрости - советы и ответы на вопросы

Ко мне приходят письма по поводу обработки ошибок. Попробую изложить то, что мне известно:
 
Объявление обработчика ошибок.
On Error Goto Err_Label (Err_Label - метка на которую необъодимо переходить при ошибке)

Эта команда инициализирует обработчик и далее все ошибки которые будут происходить будут обрабатываться вами самими по указанной вам метке.
Отменить это можно командой
    On Error Goto 0
Кроме этого есть еще команда
    On Error Resume Next
Эта команда заставляет бейсик при ошибке переходить на следующую строку.

Дальше обязательно (чтобы не попасть в сам обработчик и не вызвать ошибу) нужно перед меткой-обработчиком ошибки закончить функцию или процедуру (Exit Function, Exit Sub или Exit Property)

Выход из обработчика ошибок производится по команде Resume
Если у Resume нет параметров, то выполнение продолжается с команды,
выполневшей ошибку, если
Resume Next, то со следующей строки, а если
Resume line, то со строки имеющей номер line или метку line. Если line=0, то это аналонично отсутствию параметра у команды.

И существует еще объект Err
 у которого есть несколько свойств и методов,
позволяющих манипулировать этим объектом и получить необходимую информацию
об ошибке.
Вот некоторые из них:
  • свойство Description - описание ошибки
  • свойство Number - номер ошибки
  • свойство Source - имя объекта или приложение, которое вызвало ошибку. К сожалению эта фцнкция не возвращает имя процедуры, в которой произошла ошибка.
  • метод Raise - генерирует ошибку с указанным номером. Это может быть как системная ошибка, так и ошибка определенная пользователем.
  • метод Clear - сбрасывает объект Err. Необходимо заметить, что объект Err сбрасывается при Exit Sub, Exit Function, Exit Property и Resume Next.
Некоторые предосторожности.
  1. Еще раз повторю - не забудте перед обработчиком выйти из процедуры, функции или свойства.
  2. Никогда не выходите из обработчика по GoTo. Один раз сделав это вы навсегда теряете возможность отловить ошибку, т.к. уже находитесь в ее обработчике. Пользуйтесь только Resume.
  3. Если вы из одной функции (процедуры или свойства) в которой есть обработчик ошибок вызываете другую, в которой ее нет, то в случае возниконовения во второй функции ошибки вы попадете в обработчик первой функции.
 
 
Еще одна функция.
Почему-то Microsoft забыла положить эту функцию в MSDN
Это Erl() она возвращает последний номер строки за которой была ошибка. , но для нормального использования этой функции надо пронумеровать процедуру (или весь проект), что не очень удобно, хотя если у вас есть VB Advantage , то это может очень облегчить вам жизнь, т.к. он позволит вам как пронумеровать (и разнумеровать) строки, так и проставит вам Обработчики ошибок. А если его у вас нет, то ничего не мешает вам в каждой процедуре прописать свой обработчик ошибок.

 
Примеры.
Если надо определить в какой строке ошибка (я правда не понимаю почему не нажать кнопку Debug)
Не используйте такой способ в не VB Environmemtе
 
Sub Proc1()
    ' инициализируем обработчик ошибок
   
On Error Goto Proc1_Err

    ' код вашей процедуры

    Exit Sub

    ' отсюда начинается обработчик ошибок
Proc1_Err:

    ' проверяем на всякий случай была ли ошибка или мы забыли написать
    ' Exit Sub :)

    If Err.Number <> 0 Then
       ' Выводим сообщение об ошибке, если надо. Сейчас нам это надо.
       Msg = "Error # " & Str(Err.Number) & " was generated by " _
             & Err.Source & Chr(13) & Err.Description
       MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext

      ' Тут мы остановимся и нужно будет ручками переставить курсор выполнения
      ' програмы (желтую стрелочку) на следующую строчку - либо перетащить,
      ' либо поставить курсор на следующую строку и нажать Ctrl-F9
       Debug.Assert False

       ' Ну и теперь нажимаем F8 , т.е. переходим на ту строку,
       'которая и вызвала ошибку...
       Resume 0
    End If
End Sub
 
Oбработка ошибки при чтении несуществующего файла
 
Sub Proc2()    
    ' инициализируем обработчик ошибок
   
On Error Goto Proc2_Err
 
    Image1.Picture = LoadPicture(Text1.Text)
    ' код вашей процедуры

    Exit Sub

    ' отсюда начинается обработчик ошибок
Proc2_Err:
    ' 53 = File not found
    ' 75 = Path/File access error

        If Err = 53 Or Err = 75 Then
            Set Image1 =
Nothing
            Exit Sub
        End If
    ' для остальных ошибок генерируем ошибку
    Err.Raise Err.Number   
End Sub

Надеюсь я вам смог помочь...
WBR, Kosty

 

Хочу поставить в известность всех подписчиков этого листа - лист создается в html , а потом автоматом на Ситикоте из него создается текстовый вариант. Так что если вы, по ошибке, подписались на текстовую версию - рекомендую изменить этот параметр, так как за качество конвертации я не отвечаю, а создавать отдельную версию у меня не хватает времени. Сорри.



Ну, а напоследок ,пара рассылок, которая, по моему мнению вам может пригодится:

"Русские документы" - самые свежие компьютерные статьи

Еженедельные анонсы компьютерных статей, появившихся на сайте "Русские документы"
Вся самая интересная информация: от программирования и хитростях операционных систем до безопасности и программных руководств. И все это - на русском языке !

Подписаться:

COM/DCOM - вокруг да около
Подписаться :

 

Успехов в программировании!

Борис Рудой

Автор сайта - Visual Basic на русском



http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное