Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Часть 2. Основы офисного программирования.doc
Скачиваний:
14
Добавлен:
01.05.2025
Размер:
4 Мб
Скачать
☆

5.4.Отладка программ

В редактор VBE включены средства отладки, которые позволяют осуществить пошаговое исполнение программы (выполнение программы приостанавливается после исполнения каждой инструкции), добавить в текст программы точки останова (до достижения этой точки программа выполняется в обычном режиме, а при обнаружении точки останова переходит в режим прерывания), отслеживать контрольные значения при пошаговом выполнении программы.

Для работы с перечисленными средствами в редакторе VBA имеется меню и панель «Отладка».

Более подробно эти средства рассматриваются в разделе «Инструкции по интерфейсу Visual Basic» справочной системы.

Если не удается запустить на выполнение подпрограмму или макрос в приложении, следует проверить, завершено ли выполнение запущенных ранее программ.

5.5.Обработка ошибок

Обработка ошибок – это определение реакции на выполнение ошибок, которые возникают при выполнении программы. Причины ошибок могут быть как в самой программе, так и вне ее (например, может отсутствовать нужный файл). Все ошибки можно отнести к трем категориям: ошибки компиляции, возникающие, когда VBA не может интерпретировать введенный текст; ошибки выполнения, возникающие после успешной компиляции, при выполнении программы (причиной этих ошибок могут быть, например, неправильные данные, введенные пользователем), и логические ошибки, которые не распознаются VBA и не приводят к прекращению выполнения программы, но ведут к получению неверных результатов. Логические ошибки можно выявить с помощью средств отладки (пошагового выполнения программы, отслеживания контролируемых значений и т.п.).

В VBA есть несколько средств обработки ошибок:

  • оператор On Error,

  • оператор Resume,

  • оператор Error,

  • функция IsError,

  • функция CVErr,

  • объект Err.

Оператор On Error предназначен для обработки ошибок, он задает действия, которые должны быть выполнены при возникновении ошибки. Если в программе не выполнена инструкция On Error, то любая ошибка выполнения является фатальной; это означает, что выводится сообщение об ошибке и выполнение программы прекращается. Этот оператор заставляет программу реагировать на ошибку различным образом.

Подпрограмма обработки ошибок не может быть процедурой Sub или Function. Эта подпрограмма должна быть частью программы, которая отмечается с помощью метки строки или номера строки.

Оператор

On Error GoTo Метка

можно использовать как общий обработчик ошибок (в случае возникновения ошибки управление будет передано на оператор, которому предшествует указанная метка, следующие за ней инструкции могут проверить тип возникшей ошибки, уточнить причину и выполнить действия по ее устранению).

«Включенным» обработчиком ошибок называют подпрограмму, которая указана в инструкции On Error; «активным» обработчиком ошибок является включенный обработчик ошибок, который обрабатывает текущую ошибку. Если ошибка возникает в самом обработчике ошибок (в промежутке между возникновением ошибки и выполнением инструкции Resume, Exit Sub, Exit Function или Exit Property), то обработчик ошибок, определенный в текущей процедуре, не может обработать ошибку. Управление в этом случае возвращается в вызывающую процедуру; если в вызывающей процедуре включен обработчик ошибок, то обработка ошибки передается ему. Если этот обработчик ошибок является в данный момент активным, т.е. уже обрабатывает ошибку, то управление снова передается назад в вызывающую процедуру и т.д. до тех пор, пока не будет найден включенный, но не активный обработчик ошибок. Если включенный, но неактивный обработчик ошибок найден не будет, ошибка становится фатальной в том месте программы, в котором она впервые возникла. При каждой передаче управления обработчиком ошибок в вызывающую процедуру эта процедура становится текущей. После завершения обработки ошибки обработчиком в любой процедуре возобновляется выполнение текущей процедуры с той ее части, которая указана в инструкции Resume.

Для определения причины ошибки в подпрограммах обработки ошибок используют значение свойства Number объекта Err. Необходимо обеспечить в подпрограммах обработки ошибок проверку или сохранение существенных значений свойств объекта Err перед тем, как может возникнуть новая ошибка или перед вызовом процедуры, в которой может возникнуть новая ошибка. Значения свойств объекта Err описывают последнюю ошибку. Текст сообщения об ошибке, соответствующего коду ошибки Err.Number содержится в свойстве Err.Description.

Для отключения общей обработки следует использовать оператор On Error GoTo 0. Конструкция On Error GoTo 0 отключает обработку ошибок в текущей процедуре. Эта конструкция не задает переход на строку 0 для обработки ошибок, даже если в процедуре имеется строка с номером 0. Если инструкция On Error GoTo 0 не выполнялась, то обработчик автоматически отключается при выходе из процедуры.

Инструкция

On Error Resume Next

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

При обработке ошибок, возникающих при доступе к другим объектам, рекомендуется использовать конструкцию On Error Resume Next. Проверка объекта Err после каждого взаимодействия с другим объектом позволяет устранить неопределенность в том, при доступе к какому объекту возникла ошибка. Это позволяет всегда точно знать, какой объект поместил значение кода ошибки в свойство Err.Number, а также в каком объекте возникла ошибка (эта информация содержится в свойстве Err.Source).

Для того чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, следует помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property перед подпрограммой обработки ошибки, как в следующем примере:

Sub InitializeMatrix(Var1, Var2, Var3, Var4)

On Error GoTo ОбработкаОшибок

‘ Код процедуры:

. . .

Exit Sub

ОбработкаОшибок:

. . .

Resume Next

End Sub

В этом примере программа обработки ошибок помещена между инструкциями Exit Sub и End Sub, что позволяет отделить ее от части программы, соответствующей нормальному выполнению процедуры. Программу обработки ошибок можно разместить в любом месте процедуры.

Системные ошибки при вызовах библиотек динамической компоновки (DLL) не приводят к возникновению исключений и не перехватываются средствами Visual Basic. При вызове функций из библиотек DLL необходимо проверять, успешно ли возвращается каждое значение (согласно спецификациям API), и в случае неудачи проверять значение свойства LastDLLError объекта Err.

Оператор Resume используется для продолжения выполнения кода с указанной строки. Эта инструкция может использоваться только в процедурах обработки ошибок. Она имеет несколько форматов (Resume, Resume Next, Resume Строка).

Инструкция Error имитирует возникновение ошибки с кодом, переданным ей в качестве аргумента, заполняет свойства объекта Err значениями по умолчанию, после чего вызывает обработчик ошибок. Эта инструкция поддерживается для совместимости с предыдущими версиями. В новой программе, в особенности при создании объектов, следует применять для создания ошибок выполнения метод Raise объекта Err.

Функция CVErr используется для преобразования числового значения, переданного функции в качестве аргумента, в код ошибки. Возвращает значение типа Variant с подтипом Error, содержащее код ошибки, указанный пользователем.

Функция CVErr применяется для создания ошибок, определяемых пользователем, в создаваемых пользователем процедурах. Например, при создании функции, которая принимает несколько аргументов и обычно возвращает строку, имеется возможность проверить, что введенные аргументы попадают в допустимый диапазон значений. Если это не так, весьма вероятно, что функция не вернет ожидаемое значение. В этом случае функция CVErr позволяет вернуть код ошибки, чтобы знать, какие действия необходимо предпринять.

При использовании этой функции неявное преобразование значения Error не допускается. Например, не допускается прямое присвоение возвращаемого значения CVErr переменной с типом, отличным от Variant. Однако имеется возможность выполнить явное преобразование (с помощью CInt, CDbl и т.п.) значения, возвращаемого CVErr, и присвоить это значение переменной с соответствующим типом данных.

В приведенном ниже примере функция WhichRange проверяет введенное пользователем строковое значение переменной UserText на возможность его преобразования в число, принадлежащее диапазону от 1 до 10. Если преобразование не может быть выполнено или полученное число не попадает в заданный диапазон, в качестве результата вырабатывается код ошибки.

Sub CVErr_Example()

Dim VarResult As Variant

Dim UserText As String

‘ Код для ввода значения переменной UserText:

…………………………………….

‘ Вызов функции для преобразования значения переменной:

VarResult = WhichRange(UserText)

‘ Проверка, является ли результат кодом ошибки:

If IsError(VarResult) Then

MsgBox Prompt := “Нужно ввести число от 1 до 10”, _ Title := “Ошибка ввода”

Else

MsgBox Prompt := “Введено число ” & Str(VarResult)

End If

End Sub

‘ Описание функции:

Function WhichRange(ByVal Number As Integer) As Variant

If Number >= 1 And Number <= 10 Then

WhichRange = Number

Else

WhichRange = CVErr(200)

End If

End Function

Объект Err предназначен для управления информацией, связанной с ошибками. Свойства этого объекта задаются генератором ошибок Visual Basic, объектом или разработчиком программы Visual Basic. Свойством объекта, используемым по умолчанию, является свойство Number.

Если возникает ошибка выполнения, то свойства объекта Err получают значения, однозначно определяющие ошибку. В эти свойства записываются также сведения, которые могут быть использованы для обработки ошибки. Для того чтобы создать ошибку выполнения в программе, следует использовать метод Raise.

Значения свойств объекта Err сбрасываются до нулей или пустых строк (“”) после выполнения инструкций Resume или On Error любого вида, а также после выполнения инструкций Exit Sub, Exit Function или Exit Property в программе обработки ошибки. Для того чтобы явным образом сбросить значения свойств объекта Err, следует вызвать метод Clear.

Более подробную информацию об обработке ошибок и тонкостях использования различных форм описанных операторов можно получить в справочной системе.