Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Бияков О.А. Обработка ошибок в программах на VBA - файл 1.doc


Бияков О.А. Обработка ошибок в программах на VBA
скачать (310.5 kb.)

Доступные файлы (1):

1.doc311kb.05.02.2012 09:36скачать

содержание
Загрузка...

1.doc

Реклама MarketGid:
Загрузка...
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение

высшего профессионального образования
«Кузбасский государственный технический университет»
Кафедра вычислительной техники и информационных технологий

ОБРАБОТКА ОШИБОК
В ПРОГРАММАХ НА VBA

методические указания по курсу «Информатика
и программирование» для студентов специальности 351400
«Прикладная информатика в экономике»


Составитель

О.А. Бияков

















Утверждены на заседании кафедры

Протокол № 10 от 23.03.2006 г.








Рекомендованы к печати учебно-методической

комиссией специальности 351400

Протокол № 9 от 25.04.2006 г.
Электронная копия хранится в библиотеке

главного корпуса ГУ КузГТУ

Кемерово 2006



^ 1. РЕКОМЕНДАЦИИ ПО МИНИМИЗАЦИИ

КОЛИЧЕСТВА ОШИБОК В КОДЕ ПРОГРАММЫ
Любой программист стремится написать надежную программу или, по крайней мере, должен к этому стремиться. Надежная программа – это программа, в ко­торой к минимуму сведены ошибки, которую легко понять и с ко­торой можно работать без особых проблем.

Написание надежной программы – результат больших усилий и опыта. Основам этого можно научиться у преподавателя, но чтобы создавать действительно хорошие программы, потребуется много упражнений, времени и опыта. Писать надежные программы проще, если уже выработан определенный стиль. Ниже приведены несколько направленных на это рекомендаций:

• обязательно объявляйте переменные. Включая в начале каждого модуля инструкцию Оption Explicit, вы указываете VBA, что все переменные в програм­ме должны явно объявлены. Это простое действие, возможно, является самым важным в написании надежной программы, потому что предотвращает все досадные ошибки и дефекты, которые происходят из-за неправильно напи­санных названий переменных, которые, как правило, так тяжело выявить. Это можно сде­лать автоматически, включив параметр Require Variable Declaration в диало­говом окне Options редактора VBE (рис. 1);


^ Рис. 1. Диало­говое окно Options редактора VBE

• избегайте использовать тип Variant. Тип данных Variant – действительно гибкий и очень полезный, но иногда он является причиной некоторых трудно­уловимых ошибок в программе. Используйте этот тип данных тогда, когда это действительно необходимо, а не только для удобства;

• избегайте использовать тип данных Object. Он может со­держать ссылку на любой тип объектов, и эта гибкость также может быть ис­точником проблем. При всякой возможности объявляйте объектные переменные как конкретный тип, на который они будут ссылаться, например, Excel.Application. Используйте тип данных Object, только если это действительно необходимо;

выполняйте проверку данных. Не делайте ненадежных предположений о данных, с которыми работает ваша программа. Необходимо проверять корректность дан­ных, полученных в качестве аргументов процедурами и введенных пользовате­лями. Если есть хоть какие-то сомнения, проверяйте данные, прежде чем их ис­пользовать. Для этого VBA предоставляет много функций, например IsNumeric, IsArray и др.;

• будьте последовательны при объявлении переменных. Лучше поместить все объявления переменных в начало процедуры и расположить их по одному объ­явлению на строку. Кроме того, переменные типа Variant должны быть объяв­лены явно – не стоит полагаться на то, что этот тип является в VBA типом по умолчанию;

• нe пишите несколько операторов в одной строке. Вы можете поместить несколько операторов VBA в одной строке, разделив их двоеточием, но этого делать не следует, потому что такую программу будет тяжело читать.

Следуя этим рекомендациям, Вы гарантированно сократите время разработки программы.
^ 2. ТИПЫ ОШИБОК
Все возможные ошибки в программе можно разделить на три типа:

• ошибки выполнения (runtime errors) – ошибки, возникающие в процессе выполнения программы. Если не предусмотрен механизм их перехвата, то происходит аварийная остановка программы с выдачей стандартного описания такой ошибки, что не является признаком профессионально написанной программы;

• логические ошибки (bugs) – ошибки, приводящие к неправильной работе программы, выражающейся в получении неправильных результатов. Ошибки такого типа не приводят к аварийной остановки программы. Устранение таких ошибок возможно лишь исправлением алгоритма программы, который должен разрабатываться программистом на одном из первых этапов решения поставленной задачи;

• синтаксические ошибки (syntax errors) – ошибки, возникающие в процессе набора текста программы при нарушении правил синтаксиса языка VBA. Каждая строка текста программы в процессе ее набора анализируется редактором. Рекомендуется набирать текст программы в нижнем регистре, тогда после перехода на следующую строку редактора введенный текст изменится (некоторые буквы будут отображаться в верхнем регистре), что будет свидетельствовать об отсутствии синтаксических ошибок в строке текста программы. Например, набран текст:
activesheet.cells(1,1).value = txyz
и ранее была объявлена переменная tXYZ, то при переходе на следующую строку редактора текст в строке изменится:
ActiveSheet.Cells(1,1).Value = tXYZ
Если этого не произошло, необходимо проверить набранную строку. Еще раз повторим настоятельную рекомендацию набирать текст программы всегда в нижнем регистре.
^ 3. ОБРАБОТКА ОШИБОК
Далее речь пойдет только об ошибках, возникающих в процессе выполнения программы. Часто весьма затруднительно контролировать причины таких ошибок, но если трудно предотвратить ошибку, то программа должна уметь ее обрабатывать путем перехвата (trapping), иначе VBA использует принятый по умолчанию механизм обработки ошибок, то есть отображает сообщение об ошибке и завершает работу программы.

Обработка ошибок связана фактически с двумя аспектами, и оба они имеют равное значение. Первый – стремиться избегать ошибок, второй – обрабаты­вать ошибки, которых избежать нельзя. Рассмотрим эти аспекты.

1. ^ Предотвращение ошибок. Практически самое действенное оружие против ошибок – это использование хороших приемов программирования. Некоторые из этих приемов изложены выше в качестве рекомендация. Другой способ избежать ошибок – предвидеть их и принять меры по их предотвращению. В качестве примера можно привести файловые операции, которые за­частую могут вызвать ошибку при некоторых условиях, например, при попытке получить доступ к несуществующему файлу или выполнить запись в файле, дос­тупном только для чтения. Зная об этих ситуациях, нужно использовать файловые команды VBA, чтобы проверить, существует ли файл, можно ли его читать/записывать. Если это не так, необходимо отобразить сообщение для пользова­теля и пропустить программу, которая вызвала бы ошибку.

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

В практике можно избежать лишь некоторых, а не абсолютно всех ошибок. Ос­тавшиеся неизбежные ошибки необходимо обрабатывать, или перехватывать.

^ 2. Перехват ошибок. Речь идет об ошибках, большинство из которых связаны с аппаратным обеспечением, например, попыткой открыть для чтения несуществующий файл или получить доступ к совместному сетевому ресурсу, который в данный момент недоступен. Другая группа ошибок связана с пользователем, который, например, нажал не ту клавишу или ввел некорректные данные.

В самом простом варианте перехват ошибок состоит в том, чтобы дать указание программе VВA, какие действия ей необходимо выполнить при возникновении ошибок. В этом случае обработку ошибки ведет наша программа, а не механизм обработки ошибок VBA, используемый по умолчанию.

Обычно обработка ошибок выполняется на процедурном уровне, то есть в каждой процедуре, которая требует обработки ошибок, должна быть соб­ственная программа обработки ошибок. Если процедура не обрабатывает собст­венных ошибок, то все ошибки для обработки будут передаваться в процедуру, которая вызвала именно ту процедуру, в которой произошла ошибка. Если у процедуры нет своей программы обработки ошибок (то есть отсут­ствует оператор On Error), то все ошибки, которые возникают в этой процедуре, передаются в программу, вызвавшую эту процедуру. Например, если процедура А вызывает процедуру В и в процедуре В нет обработки ошибок, то все ошибки в процедуре В будут передаваться в процедуру А. Если в процедуре А задана про­грамма обработки ошибок, то ошибки будут обрабатываться этой программой.

Теоретически такую ситуацию можно использовать для определенной централизации обработки ошибок, когда одна процедура, в которой задана общая программа для обработки ошибок, вызывает несколько других процедур. Фактически это редко себя оправ­дывает. В конце концов, идея процедур состоит в том, что это отдельные и незави­симые части программы. Если обработка ошибок для одной процедуры располо­жена в другой процедуре, то первая процедура уже не является независимой. За редким исключением программы обработки ошибок не должны полагаться на такую пе­редачу ошибок: они должны обрабатываться в каждой процедуре. Перехват ошибок осуществляется с помощью оператора On Error, который устанавливает ловушку для ошибки. Его основная форма:
On Error Goto Label
Label – это программная метка, указывающая положение программы обра­ботки ошибок. Блок обработки ошибки должен находиться в теле процедуры, содержащей оператор On Error. В общем случае оператор On Error Goto является первым опера­тором в процедуре, а программа обработки ошибок помещается в конце проце­дуры. Тогда структура процедуры с обработкой ошибок в общем виде выглядит следующим образом:
Sub <имя процедуры>()

<блок описания переменных и констант>

On Error Goto Блок_обработки_ошибки

<операторы процедуры>

Exit Sub

Блок_обработки_ошибки:

<операторы программы обработки ошибки>

End Sub

Необходимо обратить внимание на использование оператора Exit Sub непосредственно перед программой обработки ошибок. Это необходимо во избежание выполнения программы обработки ошибок в случае их отсутствия. Соответственно в подпрограмме-функции, вместо этого оператора, использовался бы оператор Exit Function.

Программа обработки ошибок выполняет три задачи:

- выявление природы ошибки;

- выполнение действия по обработке ошибки (например, отобразить сообщение для пользователя);

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

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

При установки ловушки она действует только в этой конкретной процедуре. Как только эта процедура заканчивает работу, ее ловушка перестает действовать.

Существует специальная форма оператора On Error:
On Error Goto 0
Использование данного оператора заставляет VBA удалять любую ловушку ошибки, которая была предварительно установлена с помощью On Error. После удаления ловушки, если произойдет ошибка, то VBA будет выдавать стандартное сообщение об ошибках. Кроме этого, оператор On Error Goto 0 очищает объект Err, поэтому, если необходимо, сохраняйте свойства этого объекта..

Для получения информации об ошибках времени выполнения используется объект Err, который является внутренним объектом VBA глобального масштаба, поэтому не следует создавать в программе экземпляр этого объекта. При возникновении ошибки VBA помещает информацию об ошибке в свойства объекта Err. Коды ошибок приведены в приложении. Программа обработки ошибок может запрашивать эти свойства для определения вида ошибки. Эти свойства приведены в табл. 1.
Таблица 1.

Свойства объекта Err


Свойство

Описание

Description

Возвращает строку, описывающую ошибку. Тип Read/Write.

HelpContext

Содержит контекстный указатель для раздела справки, связанного с данной ошибкой. Тип Read/Write.

HelpFile

Содержит полный путь к справочному файлу, содержащему информацию, связанную с данной ошибкой. Тип Read/Write.

LastDLLError

Если ошибка была вызвана обращением к динамически подсоединяемой библиотеке (DLL), то это свойство содержит соответствующий системный код ошибки. Тип Read.

Number

Возвращает числовой код, представляющий ошибку. Это свойство объекта Err по умолчанию. Тип Read/Write.

Source

Содержит имя объекта, вызвавшего ошибку. Тип Read/Write.


Свойство Number используется для выявления конкретных ошибок. Так как каждая программа обработки ошибок находится в процедуре, а процедуры пред­назначены (по крайней мере, должны быть предназначены) для выполнения от­дельной задачи, то диапазон возможных ошибок будет ограничен. Например, в процедуре, считывающей данные из дискового файла необходимо следить за ошибками, связанными с файловыми операциями, а не с делением на ноль или индексом массива за пределами выделенного диапазона. На­пример, ошибка «File Not Found» имеет код 53, а ошибка «File Already Open» – код 55. В процедуре, связанной с файловы­ми операциями, фрагмент программы обработки ошибок может иметь следующий вид:
Блок_обработки_ошибки:

If Err = 53 Then

MsgBox "Невозможно найти файл"

Elself Err = 55 Then

MsgBox "Файл уже открыт"

End If

Обратите внимание, что в тексте программы можно не указывать свойство ^ Number так как это свойство по умолчанию для объекта Err.

Свойство Description возвращает краткую информацию, но в не которых ситуациях она может быть полезна. Например, следующий фрагмент программы отображает сообщения с информацией о любой возникшей ошибке:
Блок_обработки_ошибки:

MsgBox("Произошла " & Err & "ошибка: " & _ Err.Description)
Свойства HelpFile и HelpContext используются для разрешения пользователю просмотреть справочную информацию о какой-либо ошибке. Вряд ли это целесообразно, так как информация в справочной системе больше предназначена для разработчика, чем для пользователя. Чтобы сделать доступной справочную информацию, можно передать информацию HelpContext и HelpFile в функцию MsgBox, чтобы она отображалась по умолчанию, когда пользователь нажимает <F1> при отображении сообщения об ошибке. Например:
Блок_обработки_ошибки:

temp = "Произошла ошибка. Номер: " & Err

temp = temp & ", Описание: " & Err.Description & vbCRLF

temp = temp & "Нажмите F1 для справки об этой ошибке."

MsgBox (temp,,, "Ошибка", Err.HelpFile, Err.HelpContext)
Свойство Source указывает компонент проекта, который cгенерировал ошибку. Это свойство может быть полезно, если ошибка вызвана объектом, используемым вашей программой. Если ошибка происходит в стандартном модуле проекта, свойство Source будет содержать название проекта, если ошибка происходит в модуле класса, то Source будет содержать название проекта и имя класса через точку.

Объект ^ Err имеет метод Clear, который очищает все свойства объекта. Этот метод следует выполнить, если необходимо, чтобы объект Err не содержал старой информации о предыдущей ошибке. Метод Clear неявно вызывается всегда при выполнении любого типа оператора Resume, операторов Exit Sub, Exit Function или Exit Property, а также при выполнении любого оператора On Error.

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

Пример. Предположим, что программа должна найти файл базы данных, размещенный на совместном сетевом диске. Ошибка может произойти вследствие нескольких причин:

• файл не найден (ошибка 53);

• путь не найден (ошибка 76);

• нет доступа к устройству (ошибка 68);

• ошибка доступа к пути/файлу (ошибка 75).

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

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

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

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

3. Resume Label возобновляет выполнение программы начиная с оператора, указанного Label. Этот оператор должен находиться в той же процедуре, что и оператор Resume.

On Error Goto Блок_обработки_ошибки

<какие-либо операторы процедуры>

Повтор: Open "a:\MyFile.doc" For Input As #1

<какие-либо операторы процедуры>

Exit Sub

Блок_обработки_ошибки:

If Err = 71 Then MsgBox “В дисководе нет дискеты”

If Err = 53 Then MsgBox “На дискете отсутствует файл”

Resume Повтор
Используйте Resume Label, когда не подходят ни Resume, ни Resume Next. Можно продолжить выполнение программы с оператора, который находится как после, так и до оператора, вызвавшего ошибку.

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

Оператор On Error Resume Next наиболее полезен, когда программа получает доступ к объектам, например объектам автоматизации, потому что вся необходимая для обработки ошибок информация может быть не доступной в момент, когда происходит ошибка. Оператор следует использовать таким образом:

- при работе с объектами указать места в программе, где может произойти ошибка, связанная с объектами, например, при создании экземпляра объекта;

- непосредственно после оператора, который может вызвать ошибку, необходимо проверит объект ^ Err, чтобы увидеть, произошла ли ошибка, и если это так, то обработать ее.

Пример применения оператора On Error Resume Next:
On Error Resume Next

<какие-либо операторы процедуры>

MyObj = GetObject("какой-то объект")

If Err.Number > 0 Then ' Произошла ошибка

MsgBox “Объект “ & Err.Source & _

“ вызвал ошибку “ & Err.Number

Err.Clear

End If

^ 4. ИМИТАЦИЯ ОШИБОК
Можно имитировать возникновение ошибки VBA, используя метод Raise объекта Err. При выполнении этого метода VBA реагирует точно так же, как если бы произошла настоящая ошибка, но номер ошибки и другую информацию задае­те вы. Метод Raise использует такой синтаксис:
Err.Raise Number, Source, Description, Helpfile, Helpcontext
Number – единственный обязательный аргумент, определяющий номер ошиб­ки и задаваемый любым значением от 0 до 65535;

Source – это необязательный аргумент, определяющий источник ошибки. Если этот аргумент не задан, используется программный идентификатор теку­щего проекта.

Description – строка, описывающая ошибку. Если этот аргумент опущен, то Number сравнивается с предопределенными ошибками VBA. Если он совпадает с каким-либо кодом ошибки, то используется соответствующее описание. В про­тивном случае Description остается пустым.

Helpfile и Helpcontext определяют файл и контекст для справочной инфор­мации, связанной с ошибкой. Если эти аргументы не заданы, то в качестве фай­ла справки используется справочный файл VBA, а для контекста справки ис­пользуется контекст, соответствующий Number (если он существует).

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

Метод Raise обычно используется в двух случаях. Первый – при тестирова­нии программы обработки ошибок: можно имитировать появление различ­ных ошибок и проверить, что программы обработки ошибок выполняют именно то, что необходимо. Второй вариант – при вызове специальных ошибок из модулей класса.

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

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

Для определения специальных ошибок необходимо соответственно каждой ошибке поставить номер. Естественно, что нельзя использовать номер, кото­рый уже соответствует встроенной ошибке VBA. В модулях классов можно ис­пользовать любой номер, начиная с vbObjectError + 512 и до vbObjectError + 65536. Константа vbObjectError по умолчанию доступна в VBA. Номера в этом диапазоне свободны и не используются в связи со встроенными ошибками VBA.

Лучше определить константы для номеров ошибок и описаний, а также для имен файлов справки и контекстов, если они используются. На модульном уровне можно следующим образом объявить некоторые стандартные константы, что бы определить источник ошибки и стандартные значения для номеров ошибок:
Private Const Class_Error_Source As String = "Class ClassName"

Private Const Class_Error_Base As Long = vbObjectError + 512
Помните, что ошибки, вызванные с помощью метода Raise, обрабатываются точно так же, как и все остальные (относительно перехвата ошибок VBA). Это означает, что если ошибка будет вызвана в процедуре, в которой возможен пере­хват ошибок, то ошибка будет обработана собственной программой обработки ошибок для этой процедуры, и ошибка не будет передаваться в программу, ис­пользующую объект.

В программировании довольно часто используется прием, когда функции воз­вращают ^ True, если ее выполнение прошло без проблем, и False, если были какие-либо ошибки. Однако невозможно, во всяком случае достаточно сложно, чтобы функция возвращала другую дополнительную информацию. В такой ситуации на помощь приходит тип данных Variant. Одна из его возможностей — хранить разные типы данных. Таким образом, тип данных Variant может хранить чис­ло, представляющее собой просто число (и фактически являющееся подтипом Numeric) или число, являющееся подтипом vbError. Для преобразования Vari­ant в подтип ошибки используется функция CVErr, а затем используется функ­ция IsError, чтобы определить, является ли Variant подтипом vbError. Этот прием позволяет функции возвращать в вызывающую программу любое числовое значение, которое указывает на ошибку, если оно имеет соответствующий под­тип. Обратите внимание, что использование подтипа vbError не запускает меха­низм перехвата ошибок VBA.

Ниже показан пример такого приема. Это функция, вычисляющая квадратный корень своего аргумента. Так как из отрицательного числа извлечь квадратный корень нельзя, функция не будет работать с отрицательными аргу­ментами. Для обработки ввода отрицательного аргумента функция проверяет ар­гумент и возвращает в случае необходимости подтип vbError.

Вызывающая про­грамма может проверить значение, полученное из функции, и выполнить соот­ветствующие действия. В данном примере функция возвращает абсолютно про­извольное значение 2006. Если в процедуре существует больше одной ситуации возможной ошибки, вы можете определить собственные значения ошибок, кото­рые возвращает функция.
Public Function SguareRoot(value As Variant) As Variant

If value < 0 Then

SquareRoot = CVErr(2006)

Else

SquareRoot = value ^ 0.5

End If

End Function
Программа может вызвать эту функцию и проверить значение, которое воз вращает функция, таким образом:
Sub xxx()

Dim х, у

х = InputBox("Введите число для извлечения квадратного корня") у = SquareRoot(x)

If IsError(y) Then

MsgBox("Введено отрицательное чис­ло!")

Else

MsgBox("Квадратный корень из " _

& CStr(х) & " равен " & CStr(у))

End If

End Sub


^ 5. ТЕСТИРОВАНИЕ И РЕГИСТРАЦИЯ ОШИБОК
Как и любую другую программу, прежде чем приложение будет готово к выпуску, программу обработки ошибок также следует тщательно протестировать. В случае с ошибками большая часть тестирования состоит в том, чтобы вызывать ошибки и анализировать, как на них реагирует программа. Некоторые ошибки можно запускать непосредственно, например, не вставив дискету в дисковод Другие ошибки можно имитировать при помощи метода Raise. Тестирование ошибок – это нелегкая, но важная часть процесса разработки, рекомендуется проводить ее вместе с другими специалистами, так как вы можете упустить из виду некоторые ситуации, в которых могут возникнуть ошибки.

VBA позволяет использовать несколько вариантов, которые влияют на способ обработки ошибок в среде разработки VBA. Эти параметры можно выбрать в меню Tools Options, щелкнув на корешке вкладки General в диалоговом окне. Эта вкладка изображена на рис. 2. Эти настройки определяют, когда проект прерывает работу.

Рис. 2. Вкладка настроек прерывания работы программы
• Break on All Errors (Прерывание при всех ошибках). Любая ошибка прерывает выполнение, независимо от того, активна программа обработки ошибок, или процедура находится в модуле класса.

• Break in Class Module (Прерывание в модуле класса). Выполнение проект прерывается только на ошибках, не имеющих программы обработки, которые находятся в модуле класса.

• Break on Unhandled Errors (Прерывание на необрабатываемых ошибках). Выполнение проекта прерывается на любой необрабатываемой ошибке, независимо от типа модуля, в котором она происходит.

Регистрация ошибок – ведение постоянной записи происходящих ошибок – может быть полезным инструментом. При разработке журнал ошибок может по­мочь выявить и устранить факторы, которые вызывают некоторые сложные ошибки. Даже после выпуска приложения журнал ошибок может помочь опре­делить причины неожиданно возникших ошибок.

Журнал ошибок обычно представляет собой текстовой файл на диске. Каждый раз, ко­гда происходит ошибка, информация об ошибке записывается в файл, вместе с датой и временем возникновения ошибки и другой информацией. Журнал оши­бок можно реализовать как класс, внедрив затем этот класс в проект как глобальный объект. Для сохранения текущих свойств объекта Err в файл может быть использован метод Write (или аналогичный). При этом новые записи до­бавляются в конец файла, так что журнал ошибок содержит последовательную непрерывную регистрацию ошибок.

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

При работе с непредвиденными ошибками очень полезно точно знать, где именно произошла ошибка, в какой процедуре. VBA не пре­доставляет эту информацию автоматически, но это можно достаточно просто сделать вручную. В каждой процедуре можно объявить константу, в которой хранится название процедуры, как показано ниже:
Const PROC_NAME As String = "SomeProcedure"

Dim msg As String
Тогда общая программа обработки ошибок будет выглядеть так:
Блок_обработки_ошибки:

< операторы для обработки конкретных учтенных ошибок >

msg = "Непредвиденная ошибка. Запишите "

msg = msg & "следующую информацию: " & vbCrLf

msg = msg & "Номер ошибки: " & Err.Number & vbCrLf

msg = msg & "Описание: " & Err.Description & vbCrLf

msg = msg & "Источник: " & Err.Source & vbCrLf

msg = msg & "Место ошибки: " & PROC_NAME

MsgBox (msg)
Даже самый искушенный программист не может предотвратить возникновение некоторых ошибок при выполнении программы. Отсутствие дискеты в дисково­де, выход сети из строя, некорректный ввод данных, неправильно заданный путь файла – это лишь крайне малая часть проблем, которые могут и, скорее всего, дейст­вительно возникнут. Хорошо написанная программа VBA будет учитывать эти возможные ошибки и перехватывать их во избежание таких негативных последствий как потери данных или аварийной ошибки в программе. Наиболее часто встречающиеся ошибки приведены в табл.2.

Таблица 2.

^ КОДЫ ОШИБОК И ИХ ОПИСАНИЕ


Код

Описание ошибки

3

Инструкция Return без GoSub

5

Недопустимый вызов процедуры

6

Переполнение

7

Не хватает памяти

9

Индекс выходит за пределы допустимого диапазона

10

Массив фиксированной длины или временно блокирован

11

Деление на 0

13

Несоответствие типа

14

Не хватает памяти для строки

16

Слишком сложное выражение

17

Невозможно выполнение требуемой операции

18

Произошло прерывание, вызванное пользователем

20

Инструкция Resume вне программы обработки ошибок

28

Не хватает стековой памяти

35

Процедура Sub, Function или Property не определена

47

Слишком много клиентов библиотеки приложения

48

Ошибка при загрузке библиотеки

49

Неверное соглашение о вызовах библиотеки

51

Внутренняя ошибка

52

Неверное имя или номер файла

53

Файл не найден

54

Неверный режим файла

55

Файл уже открыт

57

Ошибка устройства ввода-вывода

58

Файл уже существует

59

Неверная длина записи

61

Переполнение диска

62

Ввод за пределами конца файла

63

Неверный номер записи

67

Слишком много файлов открыто

68

Устройство недоступно

70

Нет разрешения на ресурс

71

Диск не готов

74

Невозможно переименование с другим именем диска

75

Ошибка доступа к файлу/каталогу

76

Путь не найден

91

Нет объектной переменной или переменной блока With

92

Цикл For не инициализирован

93

Недопустимая строка шаблона

94

Недопустимое использование Null

97

Невозможен вызов процедуры

298

Системная библиотека DLL не загружается

320

Неправильное использование имени

321

Недопустимый формат файла

322

Невозможно создание требуемого временного файла

325

Недопустимый формат файла ресурсов

327

Не найдено значение данных по имени

328

Недопустимый параметр. Невозможна запись массивов

335

Невозможен доступ к системному реестру

336

Компонент ActiveX зарегистрирован неправильно

337

Компонент ActiveX не найден

338

Компонент ActiveX выполняется неправильно

360

Объект уже загружен

361

Невозможно загрузить или выгрузить данный объект

363

Указанный элемент ActiveX не найден

364

Объект выгружен

365

Невозможна выгрузка в данном контексте

368

Требуется файл более новой версии

371

Неправильное использование объекта в форме

380

Недопустимое значение свойства

381

Недопустимый индекс массива свойств

382

Property Set не поддерживается во время выполнения

383

Свойство доступно только для чтения

385

Требуется индекс массива свойств

387

Инструкция Property Set не разрешена

393

Инструкция Property Get не поддерживается

394

Свойство доступно только для записи

400

Невозможно модальное отображение формы

402

Необходимо закрыть самую верхнюю модальную форму

419

Нет разрешения на использование объекта

422

Свойство не найдено

423

Не найдено свойство или метод

424

Требуется объект

425

Недопустимое использование объекта

429

Нельзя создать объект или возвратить ссылку на него

430

Класс не поддерживает программирование объектов

432

Не найдено имя файла или класса

438

Объект не поддерживает это свойство или метод

440

Ошибка программирования объектов

442

Потеряна связь с библиотекой типов или объектов

443

Объект не имеет значения по умолчанию

445

Объект не поддерживает эту команду

446

Объект не поддерживает поименованные аргументы

447

Объект не поддерживает национальную настройку

448

Поименованный аргумент не найден

449

Аргумент является обязательным

450

Недопустимое число аргументов

451

Объект не является коллекцией

452

Недопустимый порядковый номер

453

Указанная функция библиотеки DLL не найдена

454

Программный ресурс не найден

455

Ошибка блокировки программного ресурса

457

Запись уже связана с элементом данного семейства

458

Переменная использует не поддерживаемый тип данных

459

Компонент не поддерживает события

460

Недопустимый формат буфера обмена

461

Указанный формат не соответствует формату данных

480

Невозможно создание обновляемого изображения

481

Недопустимый рисунок

482

Ошибка принтера

483

Драйвер принтера не поддерживает данное свойство

484

Ошибка получения системной информации о принтере

485

Недопустимый тип рисунка

486

Невозможно напечатать изображение формы на принтере

520

Невозможна очистка буфера обмена

521

Невозможно открыть буфер обмена

735

Невозможно сохранить файл в каталоге TEMP

744

Образец поиска не найден

746

Слишком длинная замена

31001

Не хватает памяти

31004

Отсутствует объект

31018

Класс не определен

31027

Невозможно активизировать объект

31032

Невозможно создать внедренный объект

31036

Ошибка сохранения в файле

31037

Ошибка загрузки из файла


Составитель:
Олег Анатольевич Бияков

^ ОБРАБОТКА ОШИБОК
В ПРОГРАММАХ НА VBA

методические указания по курсу «Информатика
и программирование» для студентов специальности 351400
«Прикладная информатика в экономике»

Подписано в печать __.__.__.

Формат 6084/16. Бумага офсетная. Отпечатано на ризографе.

Уч.-изд. л. __. Тираж __ экз. Заказ .
ГУ КузГТУ. 650026, Кемерово, ул. Весенняя, 28.
Типография ГУ КузГТУ. 650099, Кемерово, ул. Д. Бедного, 4А


Скачать файл (310.5 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru