Головна
Лекції
Завдання
Побажання
Гостьова
Лінки
Лекція №10  Скачати лекцію

Access 11

Обробка помилок під час виконання програми

Обробник помилок. Обробник помилок складається з заголовка та тіла. Рядок заголовка повинен розташовуватись безпосередньо перед тією областю текста фунуції або процедури, в якій існує найбільша небезпека виникнення помилок . Тіло обробника завжди розташовується в кінці функції або процедури – на відміну від умовних конструкцій, де рядки коду, які мають відношення до обробки помилки нічим не відрізняються від інших та розташовуються всередині виразу. Код обробника помилок виконується як правило тільки у випадку її дійсного виникнення.

Заголовок обробника помилок задається виразом:

On Error GoTo Мітка

Приклад обробника помилок

Sub Test()

On Error GOTO EXCEPT

Exit Sub

End Sub

Область дії обробника помилок обмежено границями функції. Якщо ви побудували обробник, він буде працювати тільки в межах поточної функції. При необхідності очищення стану обробника помилок на рівні функції потрібно виконати команду:

On Error GOTO 0

Ця інструкція відміняє дію всіх обробників, раніше встановлених в межах функції та скидає в початковий стан атрибути об’єкта Err.

Пасивні обробники помилок. Пасивним називають такий обробник помилок, який дозволяє програмі просто перейти до рядка, що іде після помилкового, а не звертатись до мітки, що вказує на спеціальний блок коду. Синтаксис такого обробника:

On Error Resume Next

Використання команди Resume. Команда Resume корисна у випадках, коли після виконання коду обробника помилок, необхідно повернутись до рядка, що визвав помилку і спробувати виконати його заново. Resume просто запускає на повторне виконання команду, яка є причиною останньлї помилки., тому використовувати її має сенс тильки після того, як виконані якісь дії по усуванню джерел виникнення проблеми.

Лістинг: Приклад використання команди Resume

Sub Test()Call DeleteFile("Myfile")End SubSub RaiseError(ByRef Error As Object)Call Err.Raise(Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext)End Sub

Function FileЕxists(FileName As String) As BooleanFileЕxists = Len(Dir(FileName)) > 0

End Function

Sub DeleteFile(ByVal FileName As String)

On Error GoTo EXCEPT

Kill FileName

Exit Sub

EXCEPT:

Const FILE_NOT_FOUND = 53

If (Err.Number <> FILE_NOT_FOUND) Then Call Raise.Error(Err)

If (MsgBox(Err.Description & "(" & FileName & ")" & "Повторить?", vbRetryCancel) = vbRetry) Then

FileName = InputBox("Введите имя файла:", "Имя файла", "")

If (Fileexists(FileName)) Then Resume

End If

End Sub

Процедура RaiseError власне необовязкова. Її тіло можна було б розташувати безпосередньо в рядку, в якому її викликали., але вважаємо, що ця процедура придатна для повторного використання та й обробник помилок в процедурі DeleteFile став набагато простішим. Обробник помилок лістинга здатний обробити будь-яку помилку, що виникла. Якщо код помилки не 53 (Файл не знайдено), то робиться спроба згенерувати повідомлення про помилку методом Raise обєкта Err. Якщо ж помилка звязана саме з відсутністю файла, користувачу буде запропоновано ввести нове імя файла. Тепер, якщо такий файл існує команда Resume передасть керування команді видалення.

Звичайно, ви можете написати команду:

If (FileExists(FileName)) Then Kill FileName

Але можливі ситуації, коли файл існує, але його відкрито іншою програмою, або його відмічено атрибутом “тільки для читання”. Обробник почне діяти у будь-якому випадку. Якщо проблему усунено, команда Resume дозволить повторно виконати відповідний рядок коду.

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

On Error Resume Next.

Наприкладб при виконанні операції резервного копіювання відсутність старої копії, яку ми збирались видалити не повинна призвести до зупинки програми.

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

Властивості обєкта Err . Властивість Description містять текстовий опис помилки. HelpFile та HelpContext – це відповідно, імя файла оперативної справки та номер теми в ньому. Такі дані можуть бути задані при виклику метода Raise для генерації повідомлення про помилку. В цьому випадку, натиснувши клавішу <F1>, користувач отримує можливість виклику додатка оперативної справочної системи. З автоматичним відкриттям тієї сторінки вказаної вами теми, яка на вашу думку, повинна містити найбільш детальну інформацію про помилку та можлимих подальших діях.

Властивість Source вказує на імя обєкта або додатка, який є джерелом помилки. , Number - номер помилки – число, визначене в VBA, або задане програмістом.

Властивість LastDLLError містить опис помилки, якщо вона виникла в динамічній бібліотеці, якщо вона виникла в динамічній бібліотеці, створеній засобами Visual Basic.

Методи обєкта Err. Метод Clear дозволяє очистити вміст об’єкту Err. Формат звернення до нього Err.Clear. Clear викликається автоматично при виконанні програмою команд Resume, Exit або будь-якої інструкції GoTo. Формат виклику методу Raise :

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

При зверненні до процедури Raise повинен бути вказаний, хоча б один параметр – Number, номер помилки. Якщо ви введете, скажімо, число 54, буде згенеровано відповідне повідомлення про помилку (номеру 54 відповідає помилка задання невірного режиму роботи з файлом – Bad File Mode).Щоб згенерувати повідомлення про помилку, визначену користувачем-програмістом, необхідно застосувати конструкцію Call Err.Raise (vbObjectError + Number), де Number – це заданий користувацький номер помилки. Number – обов’язковий аргумент, всі інші дозволяється не вказувати. Якщо задається параметр Source , він звичайно позначає ім’я обєкта або модуля, в якому виникла помилка. Аргумент Description застосовується для визначення рядка текстового опису помилки. Процедури HelpFile та HelpContext використовуються в тих випадках, якщо додаток містить посилання на файли оперативної допомоги, в яких знаходиться оперативна інформація про помилки та засоби усунення їх наслідків.

Застосування обробника помилок для перевірки даних, введених користувачем. Найбільш розповсюджений спосіб використання обробників звязаний із створенням блоків коду, які надають допомогу в усуненні наслідків виникнення помилок. Але обробники також зручно використовувати з метою перевірки коректності даних, введених користувачем. Ви можете застосувати стандартну функцію перетворення типів, а поряд з нею – конструкцію обробника, що дозволяє уникнути помилок, якщо інформація не піддається перетворенню.

Лістинг: Приклад використання обробника в задачі визнаення ознаки вісокосного року.

Sub Test() MsgBox IsLeapYear(2003)End SubFunction IsLeapYear(ByVal Year As Integer) As Boolean

On Error GoTo EXCEPT:

IsLeapYear = True

Dim ADate As Date

ADate = CDate("2/29/" & Year)

Exit Function

EXCEPT:

IsLeapYear = False

End Function

Проблема економії ресурсів компютера. Застосовується блоки обробників помилок від виснаження. Займаючись програмуванням, необхідно піклуватись про економію будь-яких ресурсів, обєм яких свідомо обмежений. У вашому розпорядженні є, наприклад, тільки визначена кількість вільних номерів файлів, деяке граничне число чарунок памяті та обмежений обєм вільного дискового простору. Якщо ваша програма не буде приймати необхідних мір по їх економії, то з часом ресурси можуть бути вичерпані.

Щоб вирішити задачу економії ресурсів, можна скористатись механізмом створення обробника помилок – за умови, що його тіло, яке повинне виконуватись завжди, буде містити необхідні інструкції звільнення зайнятих ресурсів.

Блок коду, який вирішує задачу захисту ресурсів компютера від виснаження, створюється як тіло звичайного обробника помилок. Але, оскільки він повинен виконуватись завжди, інструкцію Exit треба виключити. Лістинг демонструє приклад обробника, який виконує закриття файлу у будь-якому випадку – незалежно від того, виникла помилка чи ні.

Лістинг: Приклад використання обробника помилок, який гарантує економію обмежених ресурсів комп’ютера

Sub ProtectedResource()On Error GoTo FinallyDim Handle As DoubleHandle = FreeFileOpen "c:\autoexec.bat" For Input As #HandleDo While (EOF(Handle) = False) Line Input #Handle, Line

Debug.Print Line

Loop

Finally:

Close #Handle

End Sub

Рядок 2 задає заголовок обробника помилок. В цьому прикладі мова іде про забезпечення гарантій закриття файла. В наступних рядках оголошується змінна для зберігання номеру відкритого файла і в результаті визову функції FreeFile цей номер резервується операційною системою. Далі файл відкривається та виконується ряд команд обробки даних Команда, що закриває файл, виконується завжди, тому виділений файловий ресурс буде звільнено та повернено операційній системі.

Застосування обєктів Debug. Обєкт Debug особливо корисний на етапі проектування і відлагоджування додатку. Він містить 2 методи Print та Assert. Метод Print позволяє відобразити зміст елементу даних у вікні Immediate, а веріфікатор Assert передбачає задання єдиного параметра типу Boolean (перевіряємої умови) та призупиняє виконання програми, якщо умова не виконана.

 

 

Debug.Assert Len(Dir(FileName))>0

If (Len(Dir(FilrName))>0 Then

Code

Else

Code

End if

Використання директив компілятора. Директиви компілятора – це інструкції, які вказують, що робити з тим або іншим блоком коду під час його компіляції. Найбільш часте застосування в них знаходять константи та умовні керуючі структури. Звичайно, за допомогою службового слова #Const задається іменована константа, а потім буду.ться управляюча структура вигляду #If…#End If, яка охоплює блок коду та перевіряє за допомогою значення константи, потрібно включати блок у версію виконуваного файла програми чи ні.

Замість безповоротнього видалення відлагожувальних процедур із кінцевої версії тексту коду, доцільно вмістити їх в межі умовних директив компіляції будуть залежати від значення єдиної константи.

Лістинг: Приклад процедури веріфікації з умовною директивою компілятора

Test()

#Const DebuggingOn=True

Sub Assert(ByVal Test As Boolean, ByVal FileName As String, _

ByVal AssertNumber As Long)

#If DebuggingOn Then

Debug.Assert Test

#EndIf

End Sub

Єдиним недоліком цього методу ї те, що для визначення місця коду, який викликав призупинення програми веріфікатором Assert, доведеться аналізувати стек викликів процедур або значення параметрів FileName та AssertNumber . Щоб побачити стек викликів, потрібно звернутись до команди меню ViewÞ Call Stack у вікні редактора VBA. Другий зверху елемент списку відображеного у вікні Call Stack вказує на рядок коду, що викликав призупинку програми у момент веріфікації. Головна особливість структури даних, яка називається стеком, полягає в тому, що дані поступають до неї в одному порядку, а витягаються у зворотньому порядку, а витягаються у зворотньому. Інформація про послідовність звернень до функцій до процедур зберігається у так називаємому стеці викликів. Кожний раз, коли одна функція або програма викликає іншу, стек поповнюється, а при завершенні останньої викликаної функції (процедури) елемент, розташований на вершині стека, видаляється з нього.

Лекція №10  Скачати лекцію

 

Hosted by uCoz