Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

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

Работа добавлена на сайт samzan.net: 2016-03-05

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 4.5.2024

Практическая работа №5

Отладка программ на Visual Basic .NET

Поиск и исправление ошибок

Ошибки, с которыми вы до сих пор сталкивались в ваших программах, были просто опечатками, или синтаксическими ошибками. В программах встречаются и более сложные ошибки - такие, которые вы не можете найти, просто просмотрев используемые объекты, свойства и операторы. Среда разработки Visual Studio содержит несколько инструментов, которые помогут вам отследить и исправить ошибки в ваших программах. Эти инструменты не застрахуют вас от совершения ошибок, но облегчат их поиск и исправление.

Три типа ошибок

В программах на Visual Basic могут возникнуть три типа ошибок: синтаксические ошибки, ошибки времени исполнения и логические ошибки.

  1.  Синтаксическая ошибка (или ошибка компиляции) - это программная ошибка (например, неправильно написанное имя свойства или ключевое слово), которая нарушает правила написания программ на Visual Basic. Visual Basic распознает некоторые типы синтаксических ошибок при вводе операторов программы и не позволит запустить программу до тех пор, пока вы не исправите их все.
  2.  Ошибка времени исполнения - это ошибка, которая приводит к неожиданной остановке программы во время ее выполнения. Ошибки времени исполнения возникают, когда программа при выполнении останавливается из-за необнаруженной синтаксической ошибки. Ваш код сгенерирует ошибку времени исполнения, если вы, например, неправильно указали имя файла при использовании метода System.Drawing.Image.FromFile или при попытке считать данные с дисковода гибких дисков, когда в нем нет дискеты.
  3.  Логическая ошибка - это человеческая ошибка - ошибка в программе, которая приводит к тому, что код программы выдает неверные результаты. Большинство усилий при отладке тратится именно на поиск и исправление логических ошибок, совершенных программистом.

Если вы сталкиваетесь с синтаксической ошибкой, то чаще всего вы можете решить проблему с помощью справочной системы Visual Basic, из которой можно получить дополнительную информацию об ошибке, и исправить эту ошибку, уделив дополнительное внимание точному синтаксису используемых вами функций, объектов, методов и свойств. В Редакторе кода неверные операторы подчеркиваются синей волнистой линией. Удерживая указатель мыши над этим оператором, вы можете получить об ошибке дополнительную информацию. На следующей иллюстрации показано сообщение об ошибке, которое появляется в Visual Studio при некорректном вводе ключевого слова Case ("Csae" вместо "Case"). Это сообщение об ошибке выглядит как всплывающая подсказка.

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

Обнаружение логических ошибок

С точки зрения устранения, логические ошибки в программах зачастую являются наиболее сложными. Они - результат неверных предположений и планирования, а не просто неправильного понимания синтаксиса Visual Basic. Рассмотрим следующую структуру выбора If...Then, которая проверяет два условия, а затем, в зависимости от результата, отображает одно из двух сообщений:

If Age > 13 And Age < 20 Then

TextBox2.Text = "Вы тинэйджер"

Else

TextBox2.Text = "Вы не тинэйджер"

End If

Можете обнаружить ошибку в этой структуре? Тинэйджер - это человек, которому от 13 до 19 лет включительно, но эта структура не может идентифицировать человека, которому ровно 13 лет. Для этого возраста структура ошибочно отображает сообщение "Вы не тинэйджер". Этот тип ошибки не является синтаксической ошибкой (так как операторы соответствуют правилам Visual Basic); это интеллектуальная - или логическая ошибка. Правильная структура выбора содержит в первом сравнении оператора If Then оператор "больше или равно" (>=), как показано здесь:

If Age >= 13 And Age < 20 Then

Поверите вы или нет, но этот тип ошибок наиболее распространен в программах на Visual Basic.

Отладка 101: использование режима останова

Одним из способов обнаружить логическую ошибку является выполнение кода вашей программы по одной строке и изучение изменения содержимого одной или нескольких переменных. Для этого можно при работе вашей программы войти в режим останова, а затем просмотреть код в Редакторе кода. Режим останова дает возможность просмотреть программу во время ее исполнения компилятором Visual Basic. Это похоже на то, как если бы вы стояли за спиной пилота и наблюдали за тем, как он ведет самолет. Но в нашем случае вы сами можете трогать рычаги управления.

При отладке вашего приложения используется панель инструментов Debug (Отладка) - специальная панель инструментов, предназначенная для поиска ошибок. Эта панель инструментов показана на следующей иллюстрации. Ее можно открыть, выбрав команду Toolbars (Панели инструментов) в меню View (Вид), а затем щелкнув на Debug (Отладка).

В следующем упражнении вы установите точку останова, и используете режим останова для обнаружения и исправления логической ошибки в структуре If...Then. Эта ошибка является частью нормальной программы. Чтобы выявить проблему, вы будете использовать кнопку Step Into (Шаг с заходом), расположенную на панели инструментов Debug (Отладка), а для изучения значений ключевых переменных и свойств программы окно Autos (Видимые). Обратите особое внимание на эту методику отладки. Ее можно использовать для обнаружения и исправления ошибок в ваших собственных программах.

Отладка программы Debug Test

  1.  Запустите Visual Studio.
  2.  В меню File (Файл) укажите на Open (Открыть) , а затем щелкните на Project (Проект). Появится диалоговое окно Open Project (Открыть проект).
  3.  Откройте проект Debug Test, расположенный в папке c:\vbnet03sbs\Гл.8\debug test. Этот проект откроется в среде разработки.
  4.  Отобразите форму. Программа Debug Test запрашивает у пользователя возраст. Когда пользователь щелкает на кнопке Тест, программа позволяет пользователю узнать, является ли он или она тинэйджером. Однако у программы есть проблема с идентификацией возраста в 13 лет, которую мы обсуждали ранее в этой лекции. Теперь для поиска ошибки нужно открыть панель инструментов Debug (Отладка) и установить точку останова.
  5.  Если панель инструментов Debug (Отладка) не отображается, щелкните на меню View (Вид), укажите на Toolbars (Панели инструментов), а затем щелкните на Debug (Отладка). Под стандартной панелью инструментов появится панель инструментов Debug (Отладка).
  6.  Щелкните на кнопке Start (Начать) панели инструментов Debug (Отладка). Программа запустится и отобразит форму Debug Test.
  7.  Удалите 0 из текстового поля ввода возраста, введите 14, а затем щелкните на кнопке Тест. Программа отобразит сообщение "Вы тинэйджер". Итак, программа вывела корректный результат.
  8.  Введите в текстовое поле возраста 13, а затем щелкните на кнопке Тест. Программа отобразит сообщение Вы не тинэйджер, как показано здесь.

Этот ответ некорректен, и для устранения ошибки необходимо взглянуть на код программы.

  1.  Щелкните на кнопке Выход формы, а затем откройте Редактор кода.
  2.  Переместите указатель мыши к полосе Margin Indicator (указатель поля - серая полоса, расположенная сразу за левым полем окна Редактора кода) рядом с оператором Age = TextBox1.Text в процедуре события Button1_Click, а затем щелкните на этой полосе, чтобы установить точку останова. Немедленно появится красная точка останова. Точка останова показывает то место программы, где выполнение будет остановлено, и вы сможете использовать инструменты разработки Visual Studio. Положение точки останова и ее внешний вид, показаны на следующей иллюстрации.

  1.  Чтобы снова запустить программу, щелкните на кнопке Start (Начать). Как и прежде, появится форма, и вы сможете продолжить ваши тесты.
  2.  Введите в текстовое поле возраста 13, а затем щелкните на Тест. Visual Basic снова откроет Редактор кода и отобразит процедуру события Button1_Click - код программы, который в настоящий момент исполняется компилятором. Как показано на следующей иллюстрации, оператор, который вы выбрали для создания точки останова, выделен желтым цветом, а на полосе Margin Indicator (Указатель поля) появилась стрелка. Теперь Visual Studio находится в режиме останова, и вы можете узнать этот режим по слову "[break]", появившемуся в строке заголовка Visual Studio. В режиме останова можно посмотреть, как обрабатывается логика вашей программы.

Примечание. Вы также можете войти в режим останова программы на Visual Basic, поместив в вашем коде программы оператор Stop в том месте, где вы хотите приостановить выполнение. Это старый, но все еще надежный метод входа в режим останова для программ на Visual Basic.

  1.  Поместите указатель мыши в Редакторе кода над переменной Age. Visual Studio выведет сообщение "Age = 0". Пока вы находитесь в режиме останова, вы можете отображать значения переменных или свойств, просто удерживая мышь над названием переменной в коде программы. В настоящий момент Age содержит значение 0, так как текстовое поле TextBox1.Text еще не заполнено. Этот оператор является следующим оператором, который будет выполнен компилятором.

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

  1.  Чтобы выполнить следующий оператор программы, щелкните на кнопке Step Into (Шаг с заходом), расположенной на панели инструментов Debug (Отладка). Кнопка Step Into (Шаг с заходом) исполняет следующий оператор программы, расположенный в текущей процедуре события (строку, которая в данный момент выделена); она позволяет видеть, как изменяется состояние программы, когда выполняется только один ее оператор. Если вы сейчас подержите указатель мыши над переменной Age, то увидите, что она содержит значение 13.
  2.  В меню Debug (Отладка) укажите на Windows (Окна), а затем щелкните на Autos (Видимые). Подменю Debug Windows (Окна отладки) дает доступ к полному набору окон отладки, имеющихся в Visual Studio. Окно Autos (Видимые) - это автоматическое окно, показывающее состояние переменных и свойств, которые используются в текущий момент. Переменная Age содержит значение 13, свойство TextBox1.Text содержит строку "13", а свойство TextBox2.Text - пустую строку.

  1.  Еще дважды щелкните на кнопке Step Into (Шаг с заходом). Оператор If вычисляет условное выражение как False и переходит к оператору Else структуры выбора. Вот наша ошибка - логика структуры выбора некорректна, так как 13-летний человек является тинэйджером.
  2.  Выделите проверку условия Age > 13, а затем удерживайте указатель мыши над выделенным текстом. Visual Studio вычислит это условие и отобразит сообщение "Age > 13 = False".
  3.  Выделите проверку условия Age < 20, а затем удерживайте указатель мыши над выделенным текстом. Visual Studio выведет сообщение "Age < 20 = True ". Указатель мыши дал нам дополнительную подсказку - некорректный результат дает только первое условие! Так как 13-летний человек является тинэйджером, Visual Basic должен получить в результате True, но условие Age > 13 возвращает значение False. И это заставляет выполнять вариант Else структуры выбора. Вы поняли, в чем проблема? Первое сравнение для данного конкретного случая с 13 требует наличия оператора >=. Теперь остановите отладку и исправьте эту логическую ошибку.
  4.  Щелкните на кнопке Stop Debugging (Остановить отладку) панели инструментов Debug (Отладка).
  5.  В Редакторе кода добавьте в первое условие оператора If знак =. Теперь этот оператор примет вид If Age >= 13 And Age < 20 Then
  6.  Снова запустите программу и проверьте ваше решение, обращая особое внимание на значения 12, 13, 19 и 20 - "крайние" случаи, которые могут вызвать ошибки. Чтобы посмотреть, как в программе выполняется оператор If, используйте кнопку Step Into (Шаг с заходом). Чтобы отслеживать при выполнении тестов значения переменных, используйте окно Autos (Видимые). Когда появится форма, введите новое значение и снова запустите тест. Обратите внимание, что выделение отдельных выражений (например, условных проверок) и удерживание над ними мыши позволяет лучше понять, как они вычисляются.
  7.  Когда вы закончите экспериментировать с режимом останова, завершите работу программы. Для этого щелкните на кнопке Stop Debugging (Остановить отладку) на панели инструментов Debug (Отладка). Поздравляем! Вы успешно использовали режим останова для поиска и исправления логической ошибки в программе.

Отслеживание переменных с помощью окна Watch

Окно Autos (Видимые) полезно для изучения состояния отдельных переменных и свойств при их вычислении компилятором, но элементы в окне Autos (Видимые) сохраняют свои значения только для текущего (выделенного в отладчике) и предыдущего оператора (того, который только что был выполнен). Когда программа доходит до выполнения кода, не использующего эти переменные, они исчезают из окна Autos (Видимые).

Чтобы видеть содержимое переменных и свойств на протяжении всего выполнения программы, используйте окно Watch (Контрольное значение) - специальный инструмент Visual Studio, который отслеживает нужные значения, при работе в режиме останова. В Visual Basic 6 для изучения изменения значений переменных у вас был доступ к одному окну Watch (Контрольное значение). В Visual Studio .NET вы можете открыть до четырех окон Watch (Контрольное значение). Эти окна пронумерованы как Watch 1 (Контрольное значение 1), Watch 2 (Контрольное значение 2), Watch 3 (Контрольное значение 3) и Watch 4 (Контрольное значение 4) и находятся в подменю Watch (Контрольное значение), которое вы можете открыть, выбрав команду Windows (Окна) в меню Debug (Отладка). Также можно добавлять в окно Watch (Контрольное значение) такие выражения, как Age >= 13.

Открытие окна Watch

  1.  Чтобы снова запустить программу Debug Test, щелкните на кнопке Start (Начать).

Примечание. Готовый проект Debug Test находится в папке c:\vbnet03sbs\Гл.8\debug test.

Я предполагаю, что точка останова, которую вы установили в предыдущем упражнении на строке Age = TextBox1.Text, все еще присутствует. Если эта точка останова не установлена, остановите выполнение программы и установите ее, щелкнув на полосе Margin Indicator (Указатель поля) рядом с этим оператором, как показано в шаге 10 предыдущего упражнения, а затем снова запустите программу.

  1.  Введите в текстовое поле возраста число 20, а затем щелкните на Тест. Программа остановится на точке останова, и Visual Studio войдет в режим останова. Чтобы добавить в окно Watch (Контрольное значение) переменные, свойства или выражения, вы должны находиться в режиме останова. Добавить элементы очень просто: нужно выделить его в Редакторе кода, щелкнуть на выделении правой кнопкой мыши и на команде Add Watch (Добавить контрольное значение).
  2.  Выделите переменную Age, щелкните на ней правой кнопкой мыши, а затем на команде Add Watch (Добавить контрольное значение). Visual Studio откроет окно Watch 1 (Контрольное значение 1) и добавит в него переменную Age. Значение этой переменной в настоящий момент равно 0, и столбец Type (Тип) окна указывает, что переменная Age относится к типу Integer.
  3.  Выделите свойство TextBox2.Text, а затем перетащите его в пустую строку окна Watch 1 (Контрольное значение 1). Вы также можете перетаскивать элементы в окно Watch (Контрольное значение) из Редактора кода. Когда вы отпускаете кнопку мыши, Visual Studio добавляет свойство и отображает его значение (в настоящий момент это свойство содержит пустую строку).
  4.  Выделите выражение Age < 20 и добавьте его в окно Watch (Контрольное значение). "Age < 20" является условным выражением. В окне Watch (Контрольное значение) можно отобразить его логическое (Boolean) значение точно так же, как вы делали это ранее в этой лекции, удерживая мышь над условием. Ваше окно Watch (Контрольное значение) будет иметь следующий вид.

Теперь сделайте один шаг в вашем коде, чтобы увидеть, как изменятся значения в окне Watch 1 (Контрольное значение 1).

  1.  Щелкните на кнопке Step Into (Шаг с заходом) панели инструментов Debug (Отладка).

Совет. Вместо щелчка на кнопке Step Into (Шаг с заходом) на панели инструментов Debug (Отладка) можно нажать на клавиатуре клавишу (F8).

Переменная Age принимает значение 20, а условие "Age < 20" вычисляется как False. Эти значения отображаются в окне Watch (Контрольное значение) красным цветом, так как они только что обновились.

  1.  Еще три раза щелкните на кнопке Step Into (Шаг с заходом). В структуре выбора выполнится вариант Else, и значение свойства TextBox2.Text в окне Watch (Контрольное значение) изменится на "Вы не тинэйджер". Эта проверка условия работает корректно. Так как вы удовлетворены этим условием, то можете удалить его из окна Watch (Контрольное значение).
  2.  Щелкните в окне Watch (Контрольное значение) на строке "Age < 20", а затем нажмите Delete. Visual Studio удалит это значение из окна Watch (Контрольное значение). Добавлять значения в окно Watch (Контрольное значение) и удалять их из него очень просто. Оставьте Visual Studio в режиме останова. Вы продолжите использовать переменную Age в следующем разделе.

Использование окна команд

До сих пор вы использовали для отладки те инструменты Visual Studio, которые позволяют входить в режим останова, выполнять операторы по одному и изучать значения важных переменных, свойств и выражений, имеющихся в вашей программе. Теперь вы узнаете, как изменять значение переменной и выполнять другие команды с помощью окна Command (Окно команд) - инструмента среды разработки Visual Studio двойного назначения. Когда окно команд находится в режиме Immediate (Интерпретация), вы можете использовать его для взаимодействия с кодом отлаживаемой программы на Visual Basic. Когда окно команд находится в режиме Command (командном), вы можете использовать его для исполнения команд Visual Studio, таких, как Save All (Сохранить все) или Print (Печать). Если вы исполняете более одной команды, то можете использовать клавиши со стрелками для просмотра предыдущих команд и их результатов.

Следующие упражнения демонстрируют, как работает окно Command (Окно команд); они предполагают, что вы отлаживаете программу Debug Test и что эта программа в настоящий момент находится в режиме останова.

Открытие окна команд в режиме Immediate (Интерпретация)

  1.  В меню Debug (Отладка) укажите на Windows (Окна), а затем щелкните на Immediate (Интерпретация). Visual Studio откроет окно Command (Окно команд) в режиме Immediate (Интерпретация) - специальном состоянии, которое позволяет вам взаимодействовать с программой в режиме останова. Так как окно команд имеет два режима (Immediate (Интерпретация) и Command (командный)), важно научиться распознавать различные режимы, чтобы избежать ввода неверных команд. В режиме Immediate (Интерпретация) строка заголовка окна содержит текст "Command Window - Immediate" ("Окно команд: интерпретация").

Примечание. Если окно команд находится в режиме Command (Командный), вы можете переключить его в режим Immediate (Интерпретация), введя команду immed. Если окно команд находится в режиме Immediate (Интерпретация), вы можете переключить его в командный режим, введя команду >cmd. (Символ > обязателен.)

  1.  В окне команд, введите Age = 17, а затем нажмите на (Enter). Вы только что изменили значение переменной с помощью окна команд. Значение переменной Age в окне Watch (Контрольное значение) немедленно изменяется на 17, и когда оператор If будет выполнен в следующий раз, значение свойства TextBox2.Text изменится на "Вы тинэйджер". Ваше окно команд будет иметь следующий вид.

  1.  Введите в окне команд следующий оператор, а затем нажмите на (Enter):

TextBox2.Text = "Вы уже в возрасте!"

Свойство Text объекта TextBox2 немедленно изменяется на "Вы уже в возрасте!". В режиме Immediate (Интерпретация) окно команд позволяет вам изменять значения свойств, также как и переменных.

  1.  Два раза щелкните на кнопке Step Into (Шаг с заходом), чтобы снова отобразить форму Debug Test. Обратите внимание, что свойство Text объекта TextBox2 изменилось, как вы указали, но свойство Text объекта TextBox1 все еще содержит значение 20 (а не 17). Это происходит из-за того, что вы изменили в программе переменную Age, а не используемое для вывода этого значения свойство. Ваш экран будет выглядеть примерно так.

У режима Immediate (Интерпретация) окна команд много способов применения: он представляет собой великолепное дополнение к окну Watch (Контрольное значение) и поможет экспериментировать с различными тестовыми ситуациями, которые было бы сложно ввести в программу другим способом.

Переключение окна команд в командный режим

Окно команд также может быть использовано для запуска команд интерфейса среды Visual Studio. Например, команда File.SaveAll сохранит все файлы текущего проекта. Эта команда эквивалентна команде Save All (Сохранить все) из меню File (Файл). Однако прежде чем вы сможете исполнять команды среды разработки, вы должны переключить окно команд в командный режим. Попрактикуйтесь в использовании командного режима с помощью следующего упражнения.

Запуск команды File.SaveAll

  1.  Для переключения в командный режим, введите в окне команд команду >cmd, а затем нажмите на (Enter). Строка заголовка окна команд изменится на "Command Window" (Окно команд) и в окне появится символ запроса команд ">" (визуальная подсказка о том, что окно находится в командном режиме).
  2.  Введите в окне File.SaveAll, а затем нажмите на (Enter). Visual Studio сохранит текущий проект, а затем снова появится запрос команды.

Совет. Вы видели все команды, которые появились, когда вы ввели в окне команд слово "File"? Окно команд использует функцию автозавершения написания команд и показывает вам все команды, начинающиеся с символов, которые вы уже ввели. Это мощная функция, с помощью которой можно найти большинство команд, выполняемых с помощью окна команд.

  1.  Щелкните на кнопке Закрыть окна команд.

Следующий шаг: удаление точек останова

Если вы внимательно следовали инструкциям в этой лекции, то программа Debug Test все еще выполняется и в ней есть точка останова. Чтобы удалить эту точку останова и завершить программу, выполните следующие шаги. Итак, отладка программы Debug Test завершена.

Удаление точки останова

  1.  Щелкните в Редакторе кода на красном кружке, расположенном на полосеMargin Indicator (Указатель поля) и ассоциированном с точкой останова. Точка останова исчезнет. Это все, что касается этой задачи. Заметьте, что если у вас в программе более одной точки останова, вы можете удалить их все, щелкнув на команде Clear All Breakpoints (Снять все точки останова) из меню Debug (Отладка). Visual Studio сохраняет точки останова в вашем проекте, так что важно знать, как удалять их; в противном случае они останутся в вашей программе, даже после ее перезапуска!
  2.  Щелкните на кнопке Stop Debugging (Остановить отладку) панели инструментов Debug (Отладка). Выполнение программы Debug Test завершится.
  3.  В меню View (Вид) укажите на Toolbars (Панели инструментов), а затем щелкните на Debug (Отладка). Панель инструментов Debug (Отладка) закроется.

Обработка ошибок с помощью Try ... Catch

Ошибка времени исполнения - или обрушение программы - это неожиданная проблема, возникшая в программе на Visual Basic, после которой она не может продолжать работу. Вы могли видеть обрушение вашей первой программы, если Visual Basic не мог загрузить рисунок из файла, или в предыдущей лекции, когда вы при отладке намеренно внесли в код вашей программы ошибки. Ошибка времени исполнения возникает тогда, когда Visual Basic пытается выполнить оператор, который по какой-то причине не может быть выполнен в том виде, в котором он написан. Это не значит, что Visual Basic не достаточно умен, чтобы справиться с проблемой; это значит, что компилятору Visual Basic не сказали, что делать, если что-то пойдет не так.

К счастью, вы не обязаны мириться со случайными ошибками, которые приводят вашу программу к обрушению. Можно написать специальные процедуры Visual Basic, называемые структурными обработчиками ошибок, которые будут реагировать на ошибки времени исполнения. Обработчик ошибок отслеживает ошибку времени исполнения и говорит программе, как продолжать работу при возникновении этой ошибки. Обработчики ошибок помещаются в процедуры событий, там, где существует возможность возникновения проблемы, или в общие функции или подпрограммы, специально предназначенные для обработки ошибок. (Подробности о написании функций и подпрограмм см. в лекции 10 .) Как предполагает их название, обработчики ошибок обрабатывают ошибку с помощью оператора Try...Catch и специального объекта отслеживания ошибок, который называется Err. У объекта Err есть свойство Number, которое идентифицирует номер ошибки, и свойство Description, в котором содержится описание этой ошибки. Например, если ошибка времени исполнения произошла при загрузке файла с диска, обработчик ошибок может отобразить собственное сообщение об ошибке, которое укажет на проблему, и запретить дисковые операции до тех пор, пока эта проблема не будет устранена пользователем.

Когда использовать обработчики ошибок

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

Установка ловушки: оператор Try ... Catch

Блок кода, используемый для обработки ошибки времени исполнения, называется Try...Catch. Вы помещаете оператор Try в процедуре события непосредственно перед оператором, о котором вы беспокоитесь, а оператор Catch следует непосредственно за ним и содержит операторы, которые вы хотите выполнить, если произойдет ошибка времени исполнения. Также можно использовать некоторые дополнительные операторы, такие, как Catch When, Finally, Exit Try, а также вложенные блоки кода Try...Catch, которые демонстрируется в этой лекции. Базовый синтаксис обработчика исключений Try...Catch показан здесь.

Оператор Try указывает на начало обработчика ошибок

Try

 Операторы, которые могут вызвать ошибку времени исполнения

Catch

 Операторы, которые выполняются, если ошибка времени исполнения происходит

Finally

 Дополнительные операторы, выполняемые независимо от возникновения ошибки

End Try

где Try, Catch и End Try - это обязательные ключевые слова, а Finally и операторы, которые стоят за ним, необязательны. Заметьте, что программисты иногда называют операторы, находящиеся между ключевыми словами Try и Catch защищенным кодом, так как любые ошибки времени исполнения, возникающие в этих операторах, не приведут к обрушению программы. (Вместо этого Visual Basic выполняет операторы обработки ошибок, расположенные в блоке кода Catch.)

Ошибки путей и дисководов

В следующем примере продемонстрирована обычная ситуация возникновения ошибки времени исполнения - проблема с путем или дисководом. Чтобы выполнить это упражнение, загрузите пример проекта Visual Basic, который я создал для того, чтобы показать, как графические файлы открываются в объекте вывода изображений на форме Windows. Чтобы подготовиться к этому упражнению, вставьте дискету в дисковод A и скопируйте на него файл Fileopen.bmp. (Копию этого файла, а также проект Disk Drive Error, можно найти в папке c:\vbnet03sbs\Гл.9\disk drive error.) Вы будете использовать этот диск на протяжении всей лекции, чтобы сгенерировать ошибки времени исполнения и восстанавливаться после них.

Эксперимент с ошибками дисковода

  1.  Вставьте в дисковод A (или в ваш первый дисковод) чистую дискету и скопируйте на нее файл Fileopen.bmp. Файл Fileopen.bmp лежит в папке c:\vbnet03sbs\Гл.9\disk drive error. Чтобы скопировать файл, используйте проводник Windows или другой инструмент для копирования файлов.
  2.  Запустите Visual Studio и откройте проект Disk Drive Error, находящийся в папке c:\vbnet03sbs\Гл.9\disk drive error. В среде разработки откроется проект Disk Drive Error.
  3.  Отобразите форму проекта, если вы ее не видите. Проект Disk Drive Error является шаблоном программы, которая отображает в области вывода изображений файл Fileopen.bmp, когда пользователь щелкает на кнопке Проверить диск.
  4.  Чтобы отобразить процедуру события Button1_Click, дважды щелкните на кнопке Проверить диск формы. Между операторами Private Sub и End Sub вы увидите следующую строку кода программы:
  5.  PictureBox1.Image = _

System.Drawing.Bitmap.FromFile ("a:\Fileopen.bmp")

Метод FromFile открывает указанный файл. Здесь он открывает файл Fileopen.bmp, расположенный на диске A, и отображает его в области вывода изображений. Однако если диск вставлен не до конца, или путь к файлу указан неверно, попытка выполнить оператор приведет к возникновению ошибки "File Not Found" (файл не найден). Это и есть та ошибка времени исполнения, которую требуется перехватить.

  1.  Оставив дискету в дисководе A, щелкните на кнопке Start (Начать) и запустите программу. Появится форма проекта, показанная ниже.

  1.  Щелкните на кнопке Проверить диск формы. Программа загрузит файл Fileopen.bmp с дискеты и отобразит его в области вывода изображений, как показано здесь.

Свойство SizeMode объекта вывода изображений установлено на значение StretchImage, так что файл заполняет все пространство этого объекта. Теперь посмотрите, что происходит, когда дискета в дисководе отсутствует, а программа пытается загрузить файл.

  1.  Удалите дискету из дисковода.
  2.  Щелкните на кнопке Проверить диск формы. Программа не может найти файл, и Visual Basic генерирует ошибку времени исполнения - или необработанное исключение, которое приводит к обрушению программы. Откроется следующее диалоговое окно.

  1.  Чтобы закрыть программу, щелкните на кнопке Continue (Продолжить). Программа закроется, и вернется среда разработки.

Написание обработчика ошибок дисковода

Проблема с программой Disk Drive Error не в том, что она игнорирует имеющиеся в Visual Basic возможности по обработке ошибок - мы просто не указали, что Visual Basic должен делать, когда он встречает это исключение. Решение этой проблемы состоит в написании блока кода Try...Catch, который распознает эту ошибку и сообщает Visual Basic, что делать при ее возникновении. Теперь вы добавите в программу этот обработчик ошибок.

Использование Try ... Catch для перехвата ошибок

  1.  Если процедура события Button1_Click в Редакторе кода не отображается, отобразите ее. Добавьте в процедуру события, при выполнении которой может возникнуть проблема, обработчик ошибок. На самом деле вы пишете блок кода Try...Catch вокруг кода, являющегося потенциальным источником проблем, чтобы защитить остальную часть программы от возникающих в нем ошибок времени исполнения.
  2.  Измените процедуру события так, чтобы существующий оператор FromFile оказался между операторами Try и Catch, как показано в следующем блоке кода:

Try

PictureBox1.Image = _

   System.Drawing.Bitmap.FromFile  ("a:\Fileopen.bmp")

Catch

 MsgBox("Пожалуйста, вставьте дискету в дисковод A!")

End Try

Не нужно заново вводить оператор FromFile - просто введите перед ним и после него операторы Try, Catch, MsgBox и End Try. Этот код программы демонстрирует наиболее распространенный способ использования блока кода Try...Catch. Он помещает проблемный оператор FromFile в блок кода Try, и теперь при возникновении ошибки выполняются операторы, находящиеся в блоке кода Catch. Блок кода Catch просто отображает окно сообщения, и просит пользователя вставить требуемый диск в дисковод A, чтобы программа могла продолжать работу. Этот блок кода Try...Catch не содержит оператора Finally, так что обработчик ошибок завершается ключевыми словами End Try.

  1.  Убедитесь, что дискета из дисковода A удалена, а затем щелкните на кнопке Start (Начать), чтобы запустить программу.
  2.  Щелкните на кнопке Проверить диск. Вместо остановки исполнения программы, Visual Basic вызывает блок кода Catch, который отображает следующее окно сообщения.

  1.  Щелкните на OK, а затем на кнопке Проверить диск. Программа снова отображает это окно сообщения, и просит вставить дискету в дисковод A. Это окно сообщения будет появляться каждый раз при возникновении проблемы с загрузкой файла.
  2.  Вставьте дискету в дисковод A, щелкните на OK, а затем снова щелкните на кнопке Проверить диск. Как и ожидалось, файл появится в области вывода изображений. Обработчик ошибок полностью справился со своей задачей - вместо неумышленного обрушения программы она подсказала, как исправить ошибку, и можно продолжить работу с этим приложением.
  3.  Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы.

Настало время изучить некоторые варианты обработчика ошибок Try...Catch.

Использование блока Finally для выполнения задач устранения последствий ошибок

Как отмечалось ранее в этой лекции при рассмотрении синтаксиса оператора Try...Catch, в этом операторе можно использовать дополнительный блок Finally. Этот блок исполняет операторы независимо от того, как компилятор выполняет блоки Try или Catch. Другими словами, независимо от того, приводят ли операторы в блоке Try к ошибке времени исполнения, может иметься код, который необходимо выполнить каждый раз по завершении действия обработчика ошибок. Например, можно обновить переменные или свойства, отобразить результаты вычислений в окне сообщения или как-то иначе, выполнить "очистку" переменных или отключение ненужных объектов формы.

В следующем упражнении продемонстрировано, как работает блок Finally, отображающий второе окно сообщения, не зависящее от того, привел ли метод FromFile к ошибке времени исполнения, или нет.

Использование Finally для отображения окна сообщения

  1.  Отобразите процедуру события Button1_Click, а затем отредактируйте блок кода Try...Catch так, чтобы он содержал над оператором End Try дополнительные строки кода. Готовый обработчик ошибок должен выглядеть так.

Try

PictureBox1.Image = _

   System.Drawing.Bitmap.FromFile("a:\Fileopen.bmp")

Catch

 MsgBox("Пожалуйста, вставьте дискету в дисковод A!")

Finally

 MsgBox("Обработка ошибок выполнена")

End Try

Оператор Finally указывает компилятору, что завершающий блок кода должен выполняться независимо от того, обработана ошибка времени исполнения, или нет. Чтобы помочь вам точно разобраться, как это работает, я вставил после оператора Finally функцию MsgBox, которая отображает тестовое сообщение. Хотя это и полезно для тестирования, в реальной программе блок кода Finally можно использовать для обновления значений переменных или свойств, отображения данных или выполнения других операций.

  1.  Удалите дискету из дисковода A, а затем щелкните на кнопке Start (Начать) и запустите программу.
  2.  Щелкните на кнопке Проверить диск. Обработчик ошибок отобразит диалоговое окно, которое просит вас вставить диск в дисковод A.
  3.  Щелкните на OK. Программа выполнит блок Finally обработчика ошибок, и появится следующее окно сообщения.

  1.  Щелкните на OK, вставьте дискету в дисковод A, а затем снова щелкните на кнопке Проверить диск. Как и ожидалось, файл появляется в области вывода изображений. В дополнение к этому был выполнен блок Finally, и снова появилось окно сообщения "Обработка ошибок выполнена". Как уже отмечалось, операторы Finally исполняются в конце блока Try...Catch независимо от того, была ли ошибка, или нет.
  2.  Чтобы завершить выполнение программы, щелкните на OK, а затем на кнопке Закрыть формы.

Более сложные обработчики ошибок Try ... Catch

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

  1.  разрешения ввода нескольких строк кода в каждом из блоков Try, Catch или Finally ;
  2.  использования синтаксиса Catch When, который проверяет указанные условия возникновения ошибок;
  3.  написания вложенных блоков кода Try...Catch, которые могут быть использованы для создания сложных, но надежных обработчиков ошибок.

В дополнение к этому специальный объект обработки ошибок с именем Err позволяет определять и обрабатывать в ваших программах конкретные ошибки времени исполнения. Все эти возможности обработки ошибок обсуждаются в следующем разделе.

Объект Err

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

Свойства Err.Number и Err.Description содержат информацию о самой последней ошибке времени исполнения.

Очистить объект Err вы можете с помощью метода Err.Clear (этот метод стирает информацию о предыдущей ошибке). Однако, если вы используете объект Err в блоке Catch, очистка объекта Err обычно необязательна, так как блоки Catch выполняются только при возникновении ошибки времени исполнения в соседнем с ними блоке кода Try.

Следующая таблица содержит перечень большинства ошибок времени исполнения, которые могут возникнуть в приложениях на Visual Basic. За дополнительной информацией по конкретной ошибке обратитесь к справочной системе Visual Studio. В дополнение к этим кодам ошибок, некоторые библиотеки Visual Basic и другие компоненты (такие, как базы данных и системные компоненты) предоставляют свои собственные уникальные сообщения об ошибках, которые часто можно встретить в справочной системе. Заметьте, что, не смотря на описания сообщений об ошибках, некоторые ошибки могут появляться не так, как вы этого ожидаете. Поэтому необходимо по возможности специально проверять номера ошибок, отслеживая изменение свойства Err.Number при выполнении программы. Неиспользуемые номера ошибок в диапазоне 1-1000 зарезервированы за будущим использованием в Visual Basic .NET.

Нoмер ошибки

Сообщение об ошибке по умолчанию

5

Procedure call or argument is not valid (Недопустимый вызов процедуры или аргумент)

6

Overflow (Переполнение)

7

Out of memory (Недостаточно памяти)

9

Subscript out of range (Индекс массива выходит за его границы)

11

Division by zero (Деление на ноль)

13

Type mismatch (Несоответствие типов переменных)

48

Error in loading DLL (Ошибка при загрузке DLL)

51

Internal error (Внутренняя ошибка)

52

Bad File name or number (Неверное имя файла или число)

53

File not found (Файл не найден)

55

File already open (Файл уже открыт)

57

Device I/O error (Ошибка устройства ввода-вывода)

58

File already exists (Файл уже существует)

61

Disk full (Диск переполнен)

62

Input past end of File (Ввод после конца файла)

67

Too many Files (Слишком много файлов)

68

Device unavailable (Устройство недоступно)

70

Permission denied (Доступ запрещен (недостаточно прав доступа))

71

Disk not ready (Диск не готов)

74

Can't rename with different drive (Не могу переименовать с использованием другого дисковода)

75

Path/File access error (Ошибка доступа к папке/файлу)

76

Path not found (Путь не найден)

91

Object variable or With block variable not set (Не установлены переменная объекта или переменная блока With)

321

File format is not valid (Недопустимый формат файла)

322

Cannot create necessary temporary File (Не могу создать требуемый временный файл)

380

Property value is not valid (Недопустимое значение свойства)

381

Property array index is not valid (Недопустимый индекс массива свойств)

422

Property not found (Свойство не найдено)

423

Property or method not found (Свойство или метод не найдены)

424

Object required (Требуется объект)

429

Cannot create Microsoft ActiveX component (Не могу создать компоненту Microsoft ActiveX)

430

Class does not support Automation or does not support expected interface (Класс не поддерживает Automation или не поддерживает ожидаемый интерфейс)

438

Object does not support this property or method (Объект не поддерживает это свойство или метод)

440

Automation error (Ошибка Automation)

460

Clipboard format is not valid (Недопустимый формат буфера обмена)

461

Method or data member not found (Метод или член данных не найден)

462

The remote server machine does not exist or is unavailable (Удаленная серверная машина не существует или недоступна)

463

Class not registered on local machine (Класс не зарегистрирован на локальной машине)

481

Picture is not valid (Недопустимое изображение)

482

Printer error (Ошибка принтера)

Следующее упражнение использует для тестирования более чем одного условия ошибки времени исполнения в обработчике ошибок Try...Catch свойства Err.Number и Err.Description. Использование этой функции стало возможным благодаря записи Catch When, которая позволяет проверять в блоке кода Try...Catch конкретные ошибки.

Проверка нескольких условий ошибок времени исполнения

  1.  В процедуре события Button1_Click отредактируйте обработчик ошибок Try...Catch в соответствии с показанным ниже блоком кода. (Первоначальный оператор FromFile - тот же, что и в коде, который использовался в предыдущих упражнениях, но операторы Catch изменились.)

Try

 PictureBox1.Image = _

   System.Drawing.Bitmap.FromFile ("a:\Fileopen.bmp")

Catch When Err.Number = 53 'При ошибке File Not Found (Файл не найден)

 MsgBox("Проверьте правильность указания пути к файлу и наличие дискеты")

Catch When Err.Number = 7 'При ошибке Out Of Memory (Недостаточно памяти)

 MsgBox("Это действительно точечный рисунок?", , Err.Description)

Catch

 MsgBox("Проблема при загрузке файла", , Err.Description)

End Try

Запись Catch When используется в этом обработчике ошибок дважды, и каждый раз она используется со свойством Err.Number и проверяет, сгенерировал ли блок Try конкретный номер ошибки времени исполнения, или нет. Если свойство Err.Number содержит номер 53, это означает, что во время выполнения процедуры открытия файла произошла ошибка времени исполнения File Not Found (Файл не найден), и в окне сообщения отображается сообщение "Проверьте правильность указания пути к файлу и наличие дискеты". Если свойство Err.Number содержит номер 7, то произошла ошибка Out of Memory (Недостаточно памяти) - вероятно, она стала результатом загрузки файла, который не является файлом изображения. (Я получаю эту ошибку, если случайно пытаюсь открыть в объекте вывода изображений с помощью метода FromFile документ Microsoft Word.)

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

  1.  Чтобы запустить программу, щелкните на кнопке Start (Начать).
  2.  Удалите дискету из дисковода A.
  3.  Щелкните на кнопке Проверить диск. Обработчик ошибок отображает сообщение об ошибке "Проверьте правильность указания пути к файлу и наличие дискеты". Работает первый оператор Catch When.
  4.  Чтобы завершить выполнение программы, щелкните на OK, а затем на кнопке Закрыть формы.
  5.  Снова вставьте дискету, а затем с помощью проводника Windows или другого инструмента скопируйте на этот диск второй файл, который не содержит изображений, например, документ Word или книгу Excel. Не надо открывать этот файл в Word или Excel - они нужны только для тестирования.
  6.  В Редакторе кода в операторе программы FromFile измените имя файла Fileopen.bmp на имя файла, который вы только что скопировали на диск A. Использование файла другого формата даст вам возможность протестировать второй тип ошибки времени исполнения - исключение Out of Memory (Недостаточно памяти), которое происходит, когда Visual Basic пытается загрузить файл, не являющийся графическим или содержащим слишком много данных для объекта вывода изображений.
  7.  Снова запустите программу, а затем щелкните на кнопке Проверить диск. Обработчик ошибок отображает следующее сообщение об ошибке.

  1.  Чтобы завершить выполнение программы, щелкните на OK, а затем на кнопке Закрыть формы.
  2.  Измените имя файла в методе FromFile обратно на Fileopen.bmp. Он будет использоваться в следующем упражнении.

Оператор Catch When обладает большой мощью. В сочетании со свойствами Err.Number и Err.Description, он позволяет писать сложные обработчики ошибок, которые распознают и реагируют на несколько типов ошибок.

Генерация ваших собственных ошибок

Для тестирования вы можете искусственно сгенерировать в программе ошибки времени исполнения. Эта техника называется выбрасыванием - или генерацией - исключений. Чтобы это сделать, используйте метод Err.Raise с одним из номеров ошибок, приведенных в предыдущей таблице. Например, следующая запись использует метод Raise для создания ошибки времени исполнения Disk Full (Диск переполнен), а затем обрабатывает эту ошибку с помощью оператора Catch When:

Try

 Err.Raise(61) ' генерируем ошибку Disk Full (Диск переполнен)

Catch When Err.Number = 61

 MsgBox("Ошибка: Диск переполнен")

End Try

Когда вы узнаете, как писать собственные процедуры, эта техника позволит вам генерировать ваши собственные ошибки и возвращать их в вызывающую процедуру.

Указание периода повтора

Еще одна стратегия, которую можно использовать в обработчике ошибок - это попробовать выполнить операцию несколько раз, а затем, если проблема не исчезает, отключить ее. В следующем упражнении блок Try...Catch использует переменную-счетчик с именем Retries для отслеживания количества отображений сообщения "Пожалуйста, вставьте диск в дисковод A!", и после второго раза обработчик ошибок отключает кнопку Проверить диск. Особенность этой методики состоит в объявлении переменной Retries в верхней части кода формы программы так, что ее область видимости будет распространяться на все процедуры событий формы. Затем переменная Retries увеличивается и проверяется в блоке кода Catch. Число попыток может быть изменено простым изменением двойки в операторе, как показано здесь:

If Retries <= 2

Использование переменной для отслеживания ошибок времени исполнения

  1.  В Редакторе кода прокрутите код программы для формы на самый верх, и прямо под тэгом "Windows Form Designer generated code" ("Код, автоматически созданный конструктором форм Windows") введите следующее объявление переменной:

Dim Retries As Short = 0

Retries объявлена как целочисленная переменная типа Short, так как она не может содержать очень большие числа. Ей присваивается начальное значение 0, так что она корректно сбрасывается при каждом запуске программы.

  1.  В процедуре события Button1_Click отредактируйте обработчик ошибок Try...Catch так, чтобы он выглядел следующим образом:

Try

 PictureBox1.Image = _

   System.Drawing.Bitmap.FromFile ("a:\Fileopen.bmp")

Catch

 Retries += 1

 If Retries <= 2 Then

   MsgBox("Пожалуйста, вставьте диск в дисковод A!")

 Else

   MsgBox("Загрузка файла невозможна")

  Button1.Enabled = False

 End If

End Try

Блок Try проверяет ту же самую процедуру открытия файла, но на этот раз, если происходит ошибка, блок Catch увеличивает переменную Retries и проверяет ее, чтобы убедиться, что ее значение меньше или равно 2. Чтобы разрешить большее число попыток, число 2 можно изменить - в настоящий момент оно позволяет произойти только двум ошибкам. После того, как произошло две ошибки, выполняется блок Else, и появляется окно сообщения, указывающее, что функция загрузки файла была отключена. Кнопка Проверить диск становится неактивной - рисуется серым цветом и становится недоступной.

  1.  Чтобы запустить программу, щелкните на кнопке Start (Начать).

Примечание. Готовая программа Disk Drive Handler лежит в папке c:\vbnet03sbs\Гл.9\disk drive handler.

  1.  Удалите дискету из дисковода A.
  2.  Щелкните на кнопке Проверить диск. Обработчик ошибок отображает в окне сообщения показанное ниже сообщение об ошибке "Пожалуйста, вставьте диск в дисковод A!". За сценой переменная Retries увеличивается и становится равной 1.

  1.  Щелкните на OK, а затем на кнопке Проверить диск. Переменная Retries устанавливается на значение 2, и снова появляется сообщение "Пожалуйста, вставьте диск в дисковод A!".
  2.  Щелкните на OK, а затем в третий раз на кнопке Проверить диск. Переменная Retries увеличивается до значения 3, и исполняется блок Else. Появляется показанное здесь сообщение "Загрузка файла невозможна".

  1.  Щелкните в окне сообщения на OK. Кнопка Проверить диск формы отключается, как показано ниже.

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

  1.  Чтобы остановить программу, щелкните на кнопке Закрыть.

Использование вложенных блоков Try ... Catch

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

Try

 PictureBox1.Image = _

   System.Drawing.Bitmap.FromFile ("a:\Fileopen.bmp")

Catch

 MsgBox("Вставьте дискету в дисковод A, и нажмите OK!")

 Try

   PictureBox1.Image = _

   System.Drawing.Bitmap.FromFile ("a:\Fileopen.bmp")

 Catch

   MsgBox("Загрузка файла невозможна")

   Button1.Enabled = False

 End Try

End Try

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

В основном, вложенные обработчики ошибок Try...Catch хорошо работают, когда не требуется совершать много повторных попыток. Если требуется выполнить проблемное действие много раз, используйте переменную для подсчета попыток, или разработайте функцию, которая будет содержать обработчик ошибок и которая может быть вызвана из процедур событий много раз. (За дополнительной информацией о создании функций обратитесь к следующей лекции.)

Сравнение обработчиков ошибок с защитными техниками программирования

Обработчики ошибок являются не только механизмом для защиты программы от ошибок времени исполнения. Например, следующий код программы, чтобы проверить перед открытием файла его наличие на диске, использует метод File.Exists из пространства имен System.IO библиотеки классов .NET Framework:

If File.Exists("a:\Fileopen.bmp") Then

 PictureBox1.Image = _

   System.Drawing.Bitmap.FromFile ("a:\Fileopen.bmp")

Else

 MsgBox("Не могу найти Fileopen.bmp на диске A.")

End If

Этот оператор If Then не является обработчиком ошибок, так как он не предотвращает остановку программы из-за ошибки времени исполнения. Это просто методика проверки, которую некоторые программисты называют защитным программированием. Этот оператор использует удобный метод из библиотеки классов .NET Framework, чтобы проверить возможность выполнения файловой операции, прежде чем на самом деле пытаться ее выполнить. И, в данном конкретном случае, поверка наличия файла с помощью метода .NET Framework работает быстрее, чем ожидание, пока Visual Basic сгенерирует исключение и восстановится после ошибки времени исполнения с помощью обработчика ошибок.

Примечание. Чтобы заставить работать такую логику программы, в самое начало кода программы для формы необходимо включить следующий оператор, создающий ссылку на используемую библиотеку классов .NET Framework: Imports System.IO За дополнительной информацией об использовании оператора Imports для использования объектов, свойств и методов из библиотек классов .NET Framework обратитесь к лекции 5 .

Когда нужно использовать защитные методики программирования, а когда обработчики ошибок? Ответ зависит от того, насколько часто, по вашему мнению, будет возникать проблема с операторами, которые вы планируете использовать. Если исключение или ошибка времени исполнения будет возникать довольно редко, скажем, менее чем в 25% случаев исполнения данного конкретного кода, то использование обработчика ошибок может оказаться наиболее эффективным способом. Обработчики ошибок также более удобны, если у вас более одного проверяемого условия, и если вы хотите предоставить пользователю различные возможности реакции на ошибку. Однако если существует реальная возможность того, что данный кусок кода будет приводить к ошибкам времени исполнения в более чем 25% случаев его исполнения, то обычно защитная методика программирования является наиболее эффективным способом управления. Как уже было сказано при обсуждении блока кода If Then, метод File.Exists на самом деле работает быстрее, чем использование обработчика ошибок Try...Catch, так что имеет смысл использовать защитную методику программирования, если большое значение имеет производительность. Наконец, лучше всего использовать в коде комбинацию защитной методики программирования и структурной обработки ошибок.

Следующий шаг: оператор Exit Try

Прежде чем вы перейдете к следующей лекции, посмотрите на еще один вариант синтаксиса блоков кода Try...Catch, который может быть полезен - оператор Exit Try. Exit Try - это быстрая и простая "грубая" методика преждевременного выхода из блока кода Try...Catch ; если вы уже писали программы на Visual Basic, то вы можете заметить его сходство с операторами Exit For и Exit Sub, которые позволяют раньше времени покидать структурные конструкции. С помощью оператора Exit Try можно полностью покинуть текущий блок кода Try или Catch. Если есть блок кода Finally, то этот код будет выполнен, однако Exit Try позволяет перепрыгнуть через все остальные операторы Try или Catch.

В следующем примере процедуры показано, как работает оператор Exit Try. Сначала он проверяет, установлено ли свойство Enabled объекта PictureBox1 в значение PictureBox1 - это может указывать на то, что область вывода изображений еще не готова к приему данных. Если область вывода еще не доступна, то оператор Exit Try пропускает остальную часть блока кода до конца блока Catch, и попытка загрузки файла не производится.

Try

 If PictureBox1.Enabled = False Then Exit Try

   PictureBox1.Image = _

     System.Drawing.Bitmap.FromFile ("a:\Fileopen.bmp")

Catch

 Retries += 1

 If Retries <= 2 Then

   MsgBox("Пожалуйста, вставьте дискету в дисковод A!")

 Else

   MsgBox("Загрузка файла невозможна")

   Button1.Enabled = False

 End If

End Try

Этот пример дополняет последний обработчик ошибок, с которым вы экспериментировали в этой лекции (проект Disk Drive Handler). Если вы хотите проверить оператор Exit Try в контексте этой программы, снова загрузите проект Disk Drive Handler и введите в Редакторе кода оператор If, который содержит Exit Try. Вам также потребуется использовать окно Properties (Свойства), чтобы отключить объект вывода изображений в форме (другими словами, установить его свойство Enabled на значение False ).




1. Принципы разработки ключевых показателей эффективности КПЭ для промышленных предприятий
2. таки следовало бы приостановить поток корреспонденции поступающий на имя покойного ~ ох уж эти горюющие вд
3. природных линий использование новых технологий металл стекло
4. На сучасному етапі в правовій системі України підвищується роль конституційного права
5. 7 декабря 2013 г. Я опять достал свое старое к сожалению никого не интересующее из политиков письмо но не
6. Расчет узлов фермы
7. а как комплексная отрасль права~ совокупность юридических норм регулирующих общественные отношения скла
8. тема очень актуальна в наши дни
9. Братья Алопеусы
10. Издательство Московского университета
11. Курсовая работа- Материальная ответственность военнослужащих
12. для себя. Вместе с тем рост территории различия природных условий вызвали к жизни хозяйственную специализ
13. Поскольку эта пластическая деформация должна быть связана с движением дислокаций правомерно считать что м
14. Водоподготовка на энергетических предприятиях Автор отчета
15. Сибирская язва
16. а 29 декабря воскресенье
17. а Пневмонии вызываемые внутриклеточными возбудителями и вирусами принято выделять в отдельную группу
18. Анализ финансово-хозяйственной деятельности ООО «СРеЗ»
19. криминогенность рождается и умирает вместе с преступлением Криминология
20. по теме Управление конфликтом в организации1 Преподаватель ' А