Ко мне приходят письма по поводу обработки ошибок. Попробую
изложить то, что мне известно:
Объявление обработчика ошибок.
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.
Некоторые предосторожности.
Еще раз повторю - не забудте перед обработчиком выйти
из процедуры, функции или свойства.
Никогда не выходите из обработчика по GoTo. Один раз сделав
это вы навсегда теряете возможность отловить ошибку, т.к. уже находитесь
в ее обработчике. Пользуйтесь только Resume.
Если вы из одной функции (процедуры или свойства) в
которой есть обработчик ошибок вызываете другую, в которой ее нет,
то в случае возниконовения во второй функции ошибки вы попадете в
обработчик первой функции.
Еще одна функция.
Почему-то 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
Хочу поставить в известность всех подписчиков
этого листа - лист создается в html , а потом автоматом на Ситикоте
из него создается текстовый вариант. Так что если вы, по ошибке, подписались
на текстовую версию - рекомендую изменить этот параметр, так как за
качество конвертации я не отвечаю, а создавать отдельную версию у меня
не хватает времени. Сорри.
Ну, а напоследок ,пара рассылок, которая, по моему мнению вам может
пригодится: