Как VB реагирует на наши ошибки

В 1.1 на примере похода на футбол я уже показал вам, к каким катастрофическим последствиям могут привести ошибки в программе. Что будет, если вы допустите ошибку в программе на VB? Это зависит от того, что это за ошибка и сумеет ли VB ее своевременно обнаружить. Рассмотрим 3 типа ошибок.

Смысловые ошибки– 1. Итак, вы сохранили свой первый проект. Закройте его – File ® Close Solution. Создайте новый проект. Он предназначен для того, чтобы мы намеренно допускали в нем ошибки и учились их исправлять. Назовите проект как-нибудь, например, «Ошибки». Поместите на форму одну-единственную кнопку (Рис. 1.15).

Как VB реагирует на наши ошибки - student2.ru

Рис. 1.15

В режиме проектирования сделайте двойной щелчок по этой кнопке и в возникшей заготовке процедуры в окне кода введите такой код:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim a = 90

Button1.Width = 100 - a

End Sub

Поясним его.

Оператор Dim a = 90 означает «Объявим, что существует переменная a и присвоим ей значение 90». Другими словами, «Пусть а будет равно 90». Оператор Button1.Width = 100 - aозначает «Сделать ширину кнопки Button1равной 100 – a», то есть в нашем случае 10. Если вы подзабыли, что такое переменная величина, читайте 5.1.

Запустите проект, нажмите кнопку. Кнопка стала слишком узкой, так как 10 – достаточно маленькая величина. Мы склонны считать это нашей ошибкой, но не можем требовать от VB, чтобы он такие ошибки обнаруживал. Действительно, откуда ему знать, может, нам нравится иметь такие узенькие кнопки. Таким образом, существуют смысловые (с точки зрения человека) ошибки в коде и дизайне проекта, которые VB ошибками не считает и поэтому не обнаруживает и в принципе обнаруживать не должен.

Смысловые ошибки – 2. Завершите выполнение проекта. Изменим код процедуры (я показываю только тело):

Dim a = 300

Button1.Width = 100 - a

Явная ерунда. Получается, что ширина кнопки должна стать отрицательной (-200). Так не бывает. Запустите проект, нажмите кнопку. Кнопка исчезает. Завершите выполнение проекта. Вот эту-то ошибочку VB мог бы обнаружить и дать нам знать. Но не захотел. Или не смог. Просто сделал ширину кнопки нулевой. А нам показалось, что она исчезла. Считать ли это недостатком VB? Не знаю. Во всяком случае мы должны знать, что VB не настолько умен и услужлив, чтобы обнаруживать все наши даже явные глупости.

Завершите выполнение проекта. Напоминаю, что перед любым изменением кода или дизайна проекта его выполнение нужно завершать.

Ошибки выполнения. Пока мы VB только ругали. Пришла пора хвалить. Изменим код процедуры:

Dim a = 0

Button1.Width = 100 / a

Знак «/» означает деление. Что получается? Сначала мы требуем, чтобы переменная a стала равной 0, после чего хотим, чтобы число 100 было поделено на 0. Но делить на 0 – не в человеческих силах. Интересно, может быть компьютер сможет то, что не дано человеку? Запустите проект, нажмите кнопку. VB выдает сообщение об ошибке (Рис. 1.16).

Как VB реагирует на наши ошибки - student2.ru

Рис. 1.16

Что же произошло? После нажатия кнопки VB начал честно выполнять процедуру и первый оператор Dim a = 0 выполнил без проблем. При выполнении второго оператора он столкнулся с необходимостью деления на 0 и, будучи не в силах это сделать, прервал работу программы и выдал соответствующее сообщение.

Сообщение предназначено для того, чтобы пояснить человеку, знающему английский и имеющему некоторый опыт в программировании, в чем состоит ошибка. Если у вас такого опыта нет, запомните, что слово «overflow» из текста сообщения является часто указанием на деление на 0.

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

Подробнее о том, как справляться с ошибками, вы можете прочитать в Глава 9. , а сейчас жмите кнопку Break в окне сообщения. Выполнение программы прервано, но не завершено. Оно замерло на моменте ошибки. Теперь для разгадки, в чем ошибка, полезно узнать, чему в настоящий момент выполнения программы (то есть перед выполнением помеченного оператора) равны значения переменных, свойств и других элементов проекта. Для этого достаточно поместить курсор мыши на этот элемент, не нажимая, и взглянуть на всплывшую подсказку. На Рис. 1.17 курсор поставлен на свойство Width и мы видим в подсказке, что ширина кнопки равна 96. Это та ширина, которая была до выполнения оператора Button1.Width = 100 / a, то есть та первоначальная ширина кнопки, которую мы видели до момента нажатия на нее.

Как VB реагирует на наши ошибки - student2.ru

Рис. 1.17

Поместите курсор на переменную a – и VB вам подскажет, что a действительно в этот момент равна нулю.

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

Завершите выполнение проекта нажатием кнопки Как VB реагирует на наши ошибки - student2.ru (Stop Debugging)на панели инструментов и исправьте ошибку.

Итак, VB не в силах обнаружить ошибки выполнения заранее, еще до запуска проекта. Действительно, откуда ему знать, что в момент деления переменная a будет равна 0? Это ж надо в другую строку заглядывать!

Ошибки выполнения еще называют исключениями (Exceptions).

Однако, существует целый ряд ошибок, которые VB обнаруживает именно заранее. Вот они.

Ошибки компиляции(построения, build errors). Если вы разговариваете с иностранцем, то для того, чтобы он вас понял, ваши предложения должны быть правильно грамматически построены и иметь понятный иностранцу смысл. Компьютер – тот же иностранец, но он кроме этого еще и очень «тупой» иностранец, поэтому все, что вы пишете в окне кода, должно быть абсолютно правильно с точки зрения VB и грамматически и по смыслу, иначе он вас просто не поймет. Я пока не буду углубляться в то, что такое «смысл» с точки зрения VB.

Когда вы запускаете проект на выполнение, VB прежде всего смотрит, нет ли в программе грамматических и смысловых ошибок, и только если все правильно, разрешает проекту выполняться. Этот поиск ошибок происходит даже раньше запуска, еще в процессе ввода вами программного текста в окно кода. Пусть вы неправильно записали слово Width (см. Рис. 1.18) и не заметили этого. Когда вы убираете текстовый курсор из строки, которую вводили, VB уже начинает над строкой работать. Он немного подправляет ее внешний вид, приводя к стандартному. В частности, знаки арифметических операций и знаки равенства берутся в пробелы; расставляются, как положено, заглавные буквы. Но самое главное, VB обнаруживает некоторые ошибки и подчеркивает их волнистой линией.

Как VB реагирует на наши ошибки - student2.ru

Рис. 1.18

Поместите курсор мыши на подчеркнутую часть строки, не нажимая, и взгляните на всплывшую подсказку. По тексту ее можно догадаться об ошибке. В нашем случае в тексте подсказки мы видим слово ‘Wids’. Наверное, с ним что-то не в порядке. Исправьте ошибку, подчеркивание пропадет.

Некоторые ошибки VB обнаруживает только тогда, когда вы запускаете проект на выполнение. Бывает, что и вы сами не замечаете подчеркивания и запускаете проект. В обоих случаях VB выдает сообщение (Рис. 1.19):

Как VB реагирует на наши ошибки - student2.ru

Рис. 1.19

Переводится оно так: «Были ошибки построения (компиляции, build errors). Продолжать работу проекта?». Это примерно то же самое, что спросить: «Тормоза не работают. Мчимся дальше?». Но даже если вы ответите Yes, VS все равно запустит на выполнение предыдущую версию проекта, в которой еще не было ошибок. Отвечайте No и исправляйте ошибки.

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

Совет. Я не буду здесь останавливаться на сложном процессе поиска ошибок, так как вы еще к этому не готовы (читайте Глава 9. ). Если VB выдает ошибку, еще раз посмотрите, так ли выглядит ваш код, как положено. Нет ли чего лишнего? Все ли английские буквы в тексте действительно английские, или среди них есть русские? Человеку очень легко спутать английские буквы с русскими того же начертания (особенно букву «с»), компьютер же не спутает никогда и придерется.

Усложняем проект

Закройте проект ошибок. Скопируйте папку проекта «Красим форму» тут же, рядышком с собой внутри папки Visual Studio Projects. Переименуйте как-нибудь скопированную папку, например, «Красим форму 1». Над копией будем продолжать работу. Откройте проект из этой папки. Это можно сделать в Windows двойным щелчком по файлу проекта или решения. Обратите внимание, что от изменения названия папки имя проекта не изменилось.

Усложним проект. Пусть при щелчке по кнопке Button1 происходит что-нибудь еще, кроме изменения ширины полосы прокрутки, а именно три вещи:

· В текстовом поле TextBox1 появляется текст Ширина полосы = 100

· Исчезает второй элемент переключателя (RadioButton2).

· Вторая кнопка (Button2) окрашивается в желтый цвет.

Для этого достаточно в процедуру добавить 3 оператора. Начнем по порядку.

Меняем текст в TextBox1. У текстового поля TextBox1 есть свойство Text, значением которого является текст в этом поле. Поэтому добавим в процедуру оператор

TextBox1.Text = "Ширина полосы = 100"

Запомните: В окне кода значение свойства Text для текстового поля и других объектов должно браться в двойные кавычки.

Привыкайте к похожим обозначениям в VB разных вещей (у нас это TextBox1 и Text) и будьте внимательны. Наш оператор можно перевести так: Содержимое текстового поля TextBox1 сделать таким – Ширина полосы = 100.

Не думайте, что смысл слов Ширина полосы = 100 что-то значит для компьютера. Во-первых, он по-русски не понимает, а во-вторых, что бы ни было написано внутри двойных кавычек, он в это не вдумывается и как приказ не воспринимает, а просто воспроизводит в текстовом поле. Чтобы проверить, можете написать внутри кавычек любую абракадабру и запустить проект.

Вот что у нас должно получиться:

Public Class Form1

Inherits System.Windows.Forms.Form

Windows Form Designer generated code

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

HScrollBar1.Width = 100

TextBox1.Text = "Ширина полосы = 100"

End Sub

End Class

Для экономии места по вертикали я стер здесь пустые строки. И вам тоже не возбраняется.

Запустим проект. Нажмем кнопку Button1. При щелчке по кнопке Button1 VB выполнит по порядку все операторы процедуры между строками Private Sub Button1… и End Sub. Убедимся, что оба оператора выполнились. Поскольку компьютер работает очень быстро, нам будет казаться, что оба оператора выполнились одновременно. Но это не так: сначала поменялась ширина полосы прокрутки, а уж затем текст в текстовом поле.

Измените вручную текст в текстовом поле. Снова нажмите кнопку Button1. Что произошло? Завершите выполнение проекта.

Исчезает RadioButton2. Для исчезновения элемента RadioButton2 достаточно дописать в процедуру такой оператор:

RadioButton2.Hide()

Пояснение: Кроме свойств, объекты обладают и так называемыми методами. Метод– это то, что данный объект умеет делать. Вспомним пример с игрушечной железной дорогой. Там были объекты: паровозы, светофоры, стрелочники и т.п. У паровоза могут быть такие методы: ехать, гудеть, выпускать пар … У светофора – зажигать красный, зажигать зеленый … У стрелочника – переводить стрелку, петь песни … Команды паровозу и стрелочнику могли бы звучать так:

Паровоз .гуди

Стрелочник .переводи стрелку

Поскольку «Hide» по-английски означает «прятаться», то оператор RadioButton2.Hide() означает не что иное, как приказ элементу RadioButton2 спрятаться, сделаться невидимым. Говорят, что выполнился метод Hideобъекта RadioButton2. На скобки ( ) пока внимания не обращаем. О них позже.

Многие методы называют функциями. Но и об этом тоже позже.

Запишите оператор, запустите проект, проверьте его работу.

Красим Button2. Теперь нам нужно покрасить кнопку Button2 в желтый цвет. Приведу аналогию. Чтобы покрасить в желтый цвет газету, мы бы написали так:

Газета .цвет = желтый

Однако это было бы неточно, так как слово «желтый» может иметь переносный смысл – «желтая пресса». Поэтому лучше было бы написать так:

Газета .цвет бумаги = желтый

Однако и это было бы неточно, так как желтая краска из разных коробочек с красками может иметь разные оттенки. Поэтому лучше было бы написать так:

Газета .цвет бумаги = Коробка №5 .желтый

Теперь не спутаешь.

Компьютер тем более требует точности, поэтому нужный нам оператор мы пишем так:

Button2.BackColor = Color.Yellow

Пояснение: Здесь BackColor– свойство объекта Button2. Оно означает цвет поверхности кнопки. (А есть еще, например, ForeColor – цвет букв на кнопке.) Слово Yellow переводится «желтый». А слово Color, которое стоит перед ним – не что иное, как название «коробки с красками». Не путайте близкие по написанию, но абсолютно разные по смыслу слова: Color и BackColor. А также пусть не обманывает вас их буквальный перевод с английского. Не спрашивайте также меня, что значит с точки зрения VB «коробка с красками». Завтра, завтра, не сегодня!

Вот как теперь выглядит ваша процедура:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

HScrollBar1.Width = 100

TextBox1.Text = "Ширина полосы = 100"

RadioButton2.Hide()

Button2.BackColor = Color.Yellow

End Sub

Запустите проект, нажмите кнопку Button1. Вы должны увидеть такую картинку (Рис. 1.20).

Как VB реагирует на наши ошибки - student2.ru

Рис. 1.20

Дальнейшее усложнение

Закройте проект и сделайте еще одну копию его папки – «Красим форму 2». Над копией будем продолжать работу. Откройте проект из этой папки.

Работа для второй кнопки. Давайте напишем программу и для второй кнопки (Button2). Пусть при щелчке по ней:

· Ширина горизонтальной полосы прокрутки становится равной 200

· В текстовом поле TextBox1 появляется текст «Ширина полосы = 200»

· Вновь становится виден элемент переключателя (RadioButton2).

· Кнопка Button2 окрашивается в красный цвет.

В результате картинка должна стать такой, как на Рис. 1.21.

Как VB реагирует на наши ошибки - student2.ru

Рис. 1.21

В режиме дизайна (проектирования) сделаем по кнопке Button2 двойной щелчок мышкой. Перед нами – снова окно кода, но в нем появилась заготовка другой процедуры, то есть новое приглашение – на этот раз приглашение для ввода операторов, реагирующих на щелчок кнопки Button2. Введем их. Теперь содержимое окна кода таково:

Public Class Form1

Inherits System.Windows.Forms.Form

Windows Form Designer generated code

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

HScrollBar1.Width = 100

TextBox1.Text = "Ширина полосы = 100"

RadioButton2.Hide()

Button2.BackColor = Color.Yellow

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

HScrollBar1.Width = 200

TextBox1.Text = "Ширина полосы = 200"

RadioButton2.Show()

Button2.BackColor = Color.Red

End Sub

End Class

Пояснение: Для того, чтобы элемент RadioButton2 стал снова виден, мы использовали его метод Show. Кнопка же красится в красный цвет.

Запустите проект. Пощелкайте по кнопкам. Картинка у вас попеременно будет иметь вид то Рис. 1.20, то Рис. 1.21 .

Visual Studio .NET 2003 для удобства программиста отделяет процедуры в окне кода горизонтальной чертой. В книжке я не буду этого делать, ограничившись пропуском строки.

Аналогия. Давайте проведем аналогию между нашей программой и программой, которую мы дали любителю футбола в 1.1

Та программа состояла из нескольких процедур, эта также состоит из нескольких (двух) процедур.

Та программа описывала поведение одного человека в городе, эта описывает поведение нескольких объектов на форме.

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

В той программе встречались процедуры двух типов ("Как…" и "Что делать, если…"). В этой программе обе процедуры одного типа - "Что делать, если нажата кнопка". О процедурах типа "Как…" поговорим позже.

В той программе события – это "Застрял лифт", "Заблудился", в этой события - это нажатия на кнопки.

Красим форму. А как же с обещанной покраской формы? Ах, да, забыл! Поместите на форму третью кнопку и создайте для нее такую процедуру:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Me.BackColor = Color.White

End Sub

Me – по-русски «Я». Так называют в окне кода формы саму форму, несмотря на то, что ее официальное имя – Form1. Красим мы ее в белый цвет (White). Результат нажатия на кнопку 3 виден на Рис. 1.22.

Как VB реагирует на наши ошибки - student2.ru

Рис. 1.22

Наши рекомендации