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 просто запускає на повторне виконання команду, яка є причиною останньлї помилки., тому використовувати її має сенс тильки після того, як виконані якісь дії по усуванню джерел виникнення проблеми.Лістинг: Приклад використання команди ResumeSub 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 вказує на рядок коду, що викликав призупинку програми у момент веріфікації. Головна особливість структури даних, яка називається стеком, полягає в тому, що дані поступають до неї в одному порядку, а витягаються у зворотньому порядку, а витягаються у зворотньому. Інформація про послідовність звернень до функцій до процедур зберігається у так називаємому стеці викликів. Кожний раз, коли одна функція або програма викликає іншу, стек поповнюється, а при завершенні останньої викликаної функції (процедури) елемент, розташований на вершині стека, видаляється з нього.
|