Виды ошибок в программах
|
Я учусь на своих ошибках. Ругаю себя за это, но продолжаю ошибаться. С другой стороны - это всё-таки лучше, чем не учиться совсем, и наступать на одни и те же грабли бесконечно.
При создании программ, даже простых, ошибки неизбежны. Поэтому для поиска ошибок во всех средствах разработки имеются особые инструменты для отладки. Но сегодня не об отладке и не о поиске ошибок. Сегодня о видах ошибок, которые встречаются в программах.
Итак, основных вида всего три:
Синтаксические ошибки в программах
Эти ошибки довольно распространены, особенно среди начинающих. Но эти ошибки - самые безобидные. Потому что компиляторы легко находят ошибки синтаксиса и указывают место в исходном коде, где обнаружена такая ошибка. Программисту остаётся только исправить её.
Синтаксические ошибки - это ошибки синтаксиса (а то бы вы не догадались))). То есть ошибки правил языка. Например, для Паскаля это будет синтаксической ошибкой:
WriteLn('Hello, World !!!') ReadLn;
Потому что после первой строки нет точки с запятой.
Подобные ошибки очень часто совершают новички. И это вгоняет их в ступор - они пугаются и не могут понять, что же не так с их кодом. Хотя если бы они внимательно его посмотрели и прочитали сообщение об ошибке, то легко могли бы исправить её:
Потому что в сообщении чётко сказано:
Syntax error, ";" expected but "identifier READLN" found
что можно перевести как
синтаксическая ошибка, ";" ожидалось, но "READLN" найден
То есть компилятор говорит нам: я ожидал увидеть точку с запятой, а нашёл идентификатор READLN
.
Логические ошибки в программах
Это самые противные и самые труднонаходимые ошибки. Программа может быть написана совершенно правильно с точки зрения синтаксиса языка, и при этом она будет неправильно работать. Потому что программист допустил где-то логическую ошибку.
И компилятор вам ничего об этой ошибке не расскажет, потому что правила языка не нарушены.
Поиски таких ошибок могут занять много времени и отнять у вас немало здоровья. Поэтому при разработке программ лучше не торопиться и стараться не допускать логических ошибок.
Пример логической ошибки:
for i := 1 to 10 do if i = 15 then WriteLn('i = 15');
Здесь мы сравниваем значение i
с числом 15, и выводим сообщение, если i = 15
.
Но фишка в том, что в данном цикле i
не будет равно 15 НИКОГДА, потому что в цикле переменной i
присваиваются значения от 1 до 10.
Эта ошибка довольно безобидная. Здесь мы имеем просто бессмысленный код, который не причинит никакого вреда.
Однако представьте, что программа должна выдавать какой-то сигнал тревоги, если i = 15
. Тогда получится, что никакого сигнала пользователь никогда не услышит, даже если случилось что-то страшное. А всё потому, что программист немного ошибся. Вот так вот и падают ракеты и самолёты…
Распространённые логические ошибки в С++ вы можете посмотреть здесь.
Ошибки времени выполнения программы
Даже если исходный код не содержит ни логических, не синтаксических ошибок, это ещё не означает, что ваша программа безупречна. Потому что ошибки могут возникнуть в ходе выполнения программы. Например, случайно будет удалён файл, который должна читать программа, и она не сможет его найти. Если не принять мер, то программа может завершиться аварийно. А пользователям такое поведение программ очень не нравится.
Одна из самых рапространённых ошибок времени выполнения - это неожиданное деление на ноль. Пример:
Write('y = '); ReadLn(y); x := 100 / y; WriteLn('100 / ', y, ' = ', x);
Что здесь такого? Всё правильно и с точки зрения логики, и с точки зрения синтаксиса. И в большинстве случаев программа отработает без каких-либо неожиданностей.
Но представьте, что пользователь введёт ноль. Что тогда будет? Правильно - попытка деления на ноль. А на ноль делить нельзя. Поэтому во время выполнения этой программы произойдёт ошибка, которая очень расстроит пользователя. Потому что в случае, например, с консольным приложением программа просто закроется, и пользователь не поймёт, что это было. Но зато поймёт, что программа - говно, и программы от этого разработчика лучше больше никогда не использовать.
В данном случае, если вы не уверены на 100%, что y будет отличаться от нуля, надо всегда делать проверку на ноль. И хороший код должен быть хотя бы таким:
Write('y = '); ReadLn(y); if y = 0 then WriteLn('ERROR: y = 0') else begin x := 100 / y; WriteLn('100 / ', y, ' = ', x); end;
Ну что же. На этом с видами ошибок пока всё. Изучайте программирование и поменьше ошибайтесь.
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее... |