Программирование >>  Проектирование интерфейса пользователя 

1 ... 96 97 98 [ 99 ] 100 101 102 ... 153


Листинг 18.3 демонстрирует пример использования команде! Resume. Этот код достаточно прост.

Листинг 18.3. Пример использования команды Resume

Sub Test ( )

Call DeleteFile( SomeFile )

End Sub

Sub RaiseError(ByRef Err As Object)

Call Err.Raise(Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext)

End Sub

As Boolean

1: 2 : 3:

4: 5: 6: 7 : 8: 9:

10 :Function FileExists(FileName As String) 11: EiieExists =Len(Dir(FileName)) > 0

12 :End Eunction

13 : 14 15 16 17

18 :EXCEPT:

19 :

20 21 22 23 24 25 26

Sub DeleteFile(ByVal FileName As String) On Error GoTo EXCEPT Kill FileName

Exit Sub

Const FILE NOT FOUND = 53

If (Err.Number о FILE NOT FOUND) Then Caii RaiseError(Err) If (MsgBox(Err.Description & ( & EiieName & ) &

Повторить? , vbRetryCancel ) = vbRetry) Then EiieName = InputBox( Введите имя файла: , Имя файла . If (FileExists(FileName)) Then Resume End If End Sub

I Строки 1-3 листинга 18.3 содержат текст вспомогательной подпрограммы, предназначенной для тестирования основной рассматриваемой в данный момент процедуры - DeleteFile. Процедура, расположенная в строках 5-8, в сущности, необязательна. Ее тело можно было расположить непосредственно в строке 20, но считаем, что процедура RaiseError вполне пригодна к повторному использованию, да и обработчик ошибок в процедуре DeleteFile стал заметно проще. Строки 10-12 содержат вариант функции проверки существования файла. Эта функция рассматривалась на прошлом занятии, а здесь нашла свое очередное применение - нам не понадобилось разрабатьшать ее вновь. Гвоздь программы - процедура DeleteFile - занимает строки 14-26.

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



Строки 18-26 листинга 18.3 способны обработать любую возникшую ошибку. Если номер ошибки не 53 (File Not Found - файл не найден), предпринимается попытка сгенерировать сообщение об ошибке методом Raise объекта Err. Если же ошибка связана именно с отсутствием файла, пользователю будет предложено ввести новое имя файла, приносимого в жертву. Теперь, если файл с введенным именем существует, команда Resume, расположенная в строке 24, передаст управление строке 16.

Разумеется, никто не запрещает вам написать нечто, похожее на строку, приведенную ниже:

If (FileExists(FileName)) Then Kill FileName

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

файл помечен атрибутом только для чтения ?

Да, бывают случаи, когда обработчик основывается на наборе условных выражений - это как раз то, что нужно: например, требуется проверить, содержит ли выражение правильную дату. Если такое условие решит проблему - действуйте: достаточно написать If (IsDate (Выражение) ) Then - и вы получите ответ на интересующий вас вопрос.

Примите к сведению такое общее правило: если необходимо решить

некую конкретную проблему, используйте условные выражения; если

же речь идет об обеспечении надежности кода в целом, обращайтесь к средствам построения обработчиков ошибок.

Существует масса причин, которые могут воспрепятствовать удалению файла. Вот почему обработчики ошибок, о которых мы говорим, так пенны. Обработчик помалкивает , пока все в порядке, и вступает в действие, если возникает какая-либо ошибка. Если проблема устранена, команда Resume позволяет повторно выполнить соответствующую строку кода.

Применение команды Resume Next

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

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

On Error Resume Next Kill FileName

Создание нового экземпляра файла и обработка данных

Если файл существует, он удаляется (это как раз то, что нужно), а затем выполняются обычные действия. Команда Resume Next гарантирует, что попытка удаления старого файла не приведет к остановке программы, если этого файла случайно не окажется - ведь старый файл не является центральным звеном алгоритма.



Использование объектов класса Err

Объект класса Err создается и поддерживается исполняющей системой автоматически. При возникновении ошибки свойствам объекта Err присваиваются соответствующие значения, позволяющие определить, что именно произошло. Объект Err содержит два метода, Clear и Raise, и шесть свойств - Description, HelpContext, HelpFile, Source, Number и LastDLLError. Методы дают возможность изменять состояние объекта, а свойства описывают характер ошибки.

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

Свойство Description содержит текстовое описание ошибки. HelpFile и Help-Context - это, соответственно, имя файла оперативной справки и номер темы в нем. Такие данные могут быть заданы при вызове метода ise для генерации сообщения об ошибке. В этом случае при нажатии клавиши <F1> пользователь получит возможность вызова приложения оперативной справочной системы с автоматическим открытием той страницы указанной вами темы, которая, по вашему мнению, должна

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

Свойство Source указывает на имя объекта или приложения, служащего источником ошибки. Number, номер ошибки, - это число, предопределенное в VBA (как, например, 53 - ошибка отсутствия файла, рассмотренная нами в листинге 18.3) либо заданное программистом.

Свойство LastDLLError содержит описание ошибки, если она возникла в динамической библиотеке, созданной средствами Visual Basic.

Методы объекта Err

Метод Clear позволяет очистить содержимое объекта Err. Формам адения к нему - Err.Clear. Clear вызывается автоматически при выполнении программой команд Resume, Exit или любой инструкции GoTo.

Формат вызова метода Raise описывается синтаксическим выражением:

Call Err.Raise( Number [, Source [, Description [, HelpFile [ HelpContext]]]] )

(Наименования параметров метода Raise даны на английском языке, поскольку они совпадают по смыслу со свойствами объекта Err, рассмотренными выше. -Прим. перев.) При обращении к процедуре Raise должен быть указан хотя бы один параметр - Number, номер ошибки. Если вы введете, скажем, числ4, будет сгенерировано соответствующее сообщение об ошибке (номеру 54 отвечает ошибка задания неверного режима работы с файлом - Bad File Mode). Чтобы сгенерировать сообщение по номеру ошибки, определенному пользователем-программистом, необходимо применить конструкцию Call Err.Raise (vbObjectError + Number), где Number - это заданный пользовательский номер ошибки. Акцентируем ваше внимание: Number - обязательный аргумент, все остальные разрешается не указывать. Если задается параметр Source, он обычно обозначает имя объекта или модуля, в котором произошла ошибка. Аргумент Description применяется для определения строки текстового описания ошибки. Параметры HelpFile и HelpContext используются в тех случаях, если приложение содержит ссылки на файлы оперативной помощи, в которых находится подробная информация об ошибках и способах устранения их последствий. Процедура RaiseError, приведенная в тексте листинга 18.3, содержит пример обращения к методу Raise объекта Err.



1 ... 96 97 98 [ 99 ] 100 101 102 ... 153

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика