Опубликован: 31.08.2006 | Уровень: специалист | Доступ: платный
Лекция 10:

Перехват ошибок с помощью структурной обработки ошибок

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Проверка нескольких условий ошибок времени исполнения
  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.

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


  9. Чтобы завершить выполнение программы, щелкните на OK, а затем на кнопке Закрыть формы.
  10. Измените имя файла в методе 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
< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Сайдахмад Зарипов
Сайдахмад Зарипов
Жанболат Шаймерден
Жанболат Шаймерден

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

Виталий Григорьев
Виталий Григорьев
Россия, москва, мгсги, 2011
Надежда Серекпаева
Надежда Серекпаева
Россия, Тюмень, Тюменский индустриальный институт, 1992