Обзор неструктурной обработки исключений

Автор: Пользователь скрыл имя, 11 Апреля 2011 в 16:15, реферат

Краткое описание

При неструктурной обработке исключений оператор On Error помещается в начале блока кода и обрабатывает все исключения, возникшие в пределах этого блока. Когда исключение возникает в процедуре после выполнения оператора On Error, программа ответвляется по аргументу строки, указанному в операторе On Error. Аргумент строки, представляющий собой номер или метку строки, указывает местоположение обработчика исключения.

Оглавление

Глава 1. Обзор неструктурной обработки исключений………………………3

Глава 2. Обзор структурной обработки исключений…………………………6

Глава 3. Операторы Resume и Err………………………………………………8
Библиографический список……………………………………………………

Файлы: 1 файл

VB2.docx

— 28.96 Кб (Скачать)

Содержание:

Глава 1. Обзор неструктурной обработки исключений………………………3

Глава 2. Обзор  структурной обработки исключений…………………………6

Глава 3. Операторы Resume и Err………………………………………………8

Библиографический список……………………………………………………10 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Глава 1. Обзор неструктурной  обработки исключений.

     При неструктурной обработке исключений оператор On Error помещается в начале блока кода и обрабатывает все исключения, возникшие в пределах этого блока. Когда исключение возникает в процедуре после выполнения оператора On Error, программа ответвляется по аргументу строки, указанному в операторе On Error. Аргумент строки, представляющий собой номер или метку строки, указывает местоположение обработчика исключения.

     Иногда из исходной процедуры вызывается другая, и исключение возникает в вызванной процедуре. В таких случаях, если вызванная процедура не обрабатывает исключения, они передаются обратно в вызывающую процедуру, и выполнение ответвляется по аргументу строки.

     Неструктурная обработка ошибок с использованием оператора On Error, может снизить производительность приложения и привести к сложному в отладке и поддержании коду. Рекомендуется использовать метод структурной обработки исключений. Дополнительные сведения см. в разделе Structured Exception Handling Overview for Visual Basic.

     Оператор On Error GoTo Line предполагает, что код обработки ошибки начинается со строки, указанной в обязательном аргументе line. Если возникает ошибка во время выполнения, управление ответвляется по метке или номеру строки, указанной в аргументе, активируя обработчик ошибок .. Указанная строка должна быть в той же процедуре, что и оператор On Error GoTo Line; в противном случае Visual Basic выдаст ошибку компилятора. В следующем примере демонстрируется использование обработчика ошибок с меткой строки.

     Sub TestSub 

        On Error GoTo ErrorHandler

           ' Code that may or may not contain errors.Exit Sub 

   ErrorHandler:

           ' Code that handles errors.Resume

     End Sub

     В примере имеется обработчик ошибок с именем ErrorHandler. Если какой-либо код в подпрограмме TestSub генерирует ошибку, Visual Basic немедленно выполняет код, следующий за меткой ErrorHandler. В конце блока обработки ошибок оператор Resume передает управление обратно в строку кода, где первоначально возникла ошибка. Остальная часть подпрограммы продолжает выполняться, как если бы ошибки не было.

     Оператор Exit Sub следует разместить непосредственно перед блоком обработки ошибок. В противном случае Visual Basic выполнит код обработки ошибок в конце подпрограммы, что может вызвать нежелательные или непредвиденные последствия.

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

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

     Оператор Resume может использоваться и сам по себе, вне оператора On Error. Если оператор Resume используется подобным способом, Visual Basic возвращает управление оператору, который вызвал ошибку. Обычно Resume используется после того, как обработчик ошибок исправит ошибку.

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

     Еще одним вариантом выражения Resume является Resume Line, идентичное On Error GoTo Line. Resume Line передает управление строке, заданной в аргументе line. Resume Line можно использовать только в пределах обработчика ошибок.

     При отладке кода необходимо отключить оператор On Error Resume Next.

     Оператор On Error GoTo 0 отключает все обработчики ошибок в текущей процедуре. Если оператор On Error GoTo 0 отсутствует, обработчик ошибок все равно отключается, когда заканчивается содержащая его процедура.

     Оператор On Error GoTo 0 не означает указания строки 0 в качестве начальной для кода обработки ошибок, даже если процедура содержит строку с номером 0.

     Оператор On Error GoTo -1 отключает все обработчики ошибок в текущей процедуре. Если операторOn Error GoTo -1 отсутствует, обработчик ошибок автоматически отключается, когда заканчивается содержащая его процедура.

     Оператор  On Error GoTo -1 не означает указания строки -1 в качестве начальной для кода обработки ошибок, даже если процедура содержит строку с номером -1.

Глава 2. Обзор структурной  обработки исключений в Visual Basic

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

     Использование оператора Try...Catch...Finally защищает блоки кодов, в которых потенциально могут возникнуть ошибки. Обработчики исключений могут быть вложенными, тогда переменные, объявленные в каждом блоке, будут иметь локальную область видимости.

     В следующем коде показана структура  оператора Try...Catch...Finally:

     Try

         ' Starts a structured exception handler.

         ' Place executable statements that may generate

         ' an exception in this block.

     Catch '[optional filters]

         ' This code runs if the statements listed in

         ' the Try block fail and the filter on the Catch statement is true.

     '[Additional Catch blocks]

     Finally

         ' This code always runs immediately before

         ' the Try statement exits.

     End Try

     ' Ends a structured exception handler.

     Блок  Try обработчика исключений Try...Catch...Finally содержит раздел кода, которая контролируется на предмет исключений. Если во время выполнения этого раздела возникает ошибка, Visual Basic проверяет каждый оператор в Catch внутри Try...Catch...Finally, пока не обнаружит условие, которое соответствует этой ошибке. При обнаружении такого условия управление передается первой строке кода в блоке Catch. Если соответствующий оператор Catch не найден, поиск продолжается в операторах Catch внешнего блока Try...Catch...Finally, который содержит блок, в котором возникло исключение. Этот процесс продолжается по всему стеку, пока не будет обнаружен соответствующий блок Catch в текущей процедуре. Если он не найден, выдается ошибка.

     Код в разделе Finally всегда выполняется последним, непосредственно перед тем, как блок обработки ошибок выйдет из области видимости, независимо от того, выполнен ли код в блоках Catch. В разделе Finally следует поместить код очистки (например, закрытия файлов и освобождения объектов). Если перехватывать исключения не требуется, но необходимо высвободить ресурсы, следует рассмотреть возможность использования инструкции Using вместо Finally. Дополнительные сведения см. в разделе Оператор Using (Visual Basic).

Глава 3. Операторы Resume и Err

         Возобновляет выполнение по окончании процедуры обработки ошибки.

Resume [ Next | line ]

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

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

     Line. Необязательно. Выполнение возобновляется со строки, указанной в аргументе line. Аргумент line является меткой или номером строки, которая должна находиться в той же процедуре, что и обработчик ошибок.

     Если оператор Resume используется в месте, отличном от подпрограммы обработки ошибок, возникает ошибка. Оператор Resume нельзя использовать в процедуре, содержащей инструкцию Try...Catch...Finally.

     В этом примере инструкция Resume используется для окончания обработки ошибки в процедуре и возобновления выполнения, начиная с вызвавшего ошибку оператора. Ошибка номер 55 генерируется, чтобы проиллюстрировать использование оператора Resume.

     Sub ResumeStatementDemo()

       On Error GoTo ErrorHandler   ' Enable error-handling routine.

       Dim x As Integer = 32

       Dim y As Integer = 0

       Dim z As Integer

       z = x / y   ' Creates a divide by zero error

       Exit Sub   ' Exit Sub to avoid error handler.

     ErrorHandler:     ' Error-handling routine.

       Select Case Err.Number   ' Evaluate error number.

           Case 6   ' "Divide by zero" error.

             y = 1 ' Sets the value of y to 1 and tries the calculation again.

           Case Else

             ' Handle other situations here....

       End Select

       Resume   ' Resume execution at same line

       ' that caused the error.

     End Sub

     Для того чтобы обеспечить более централизованную обработку ошибок, когда это необходимо, Visual Basic использует специальный объект Err, свойства которого можно анализировать  после возникновения ошибки. Ранее  мы видели, как работает свойство Number (Err.Number), выдающее номер ошибки.

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

       После того как выполняется  оператор Resume или On Error, все свойства  объекта Err сбрасываются в 0 или  сводятся к строке "". Свойства  данного объекта инициализируются  и после выхода из функции  или процедуры. Кроме того, для  этого можно использовать оператор Err.Clear  

     Правильным  является создание централизованного  обработчика ошибок. Однако данной процедуре необходимо передавать текущее  значение различных свойств объекта Err. Если вызвать объект Err из новой  процедуры, все его значения будут  инициализированы. Если необходимо генерировать ошибку для тестовых целей, можно  использовать метод Raise объекта Err. Его  синтаксис следующий: Err.Raise (Номер). Можно использовать метод Raise для определения собственных типов ошибок. Если необходимо вывести описание текущей ошибки, используется оператор Err.Description.

Информация о работе Обзор неструктурной обработки исключений