Классификация ошибок.
Ошибки при написании, отладке и работе программ можно разделить на этапы их времени возникновения, такие как: ошибки компиляции, выполнения, компоновки и логические ошибки.
Ошибки компиляции обнаруживаются при непосредственной трансляции исходного кода в объектный модуль или в машинный код. Невозможно перейти к стадии времени выполнения программы, пока не будут ликвидированны все ошибки стадии компиляции.
Ошибки выполнения относятся к самой непредсказуемой группе . Прежде всего они могут иметь разную природу, и соответственно по-разному проявляться. Часть ошибок обнаруживается и обрабатываются операционной системой.
Ошибки компоновки, как следует из названия, связаны с проблемами, обнаруженными при разрешении внешних ссылок. В разных языках может осуществляться на различных этапах.
Логические ошибки имеют разную природу. Так они могут следовать из ошибок, допущенных при проектировании, например, при выборе методов, разработке алгоритмов или определении структуры классов, а могут быть непосредственно внесены при кодировании модуля.
Ошибки компиляции:
1. Синтаксические ошибки.
2. Семантические ошибки.
1. Описания идентификаторов.
1. Неинициализированный указатель.
2. Неинициализированная переменная.
3. Ошибочная инициализация.
2. Статический контроль типов.
1. Не корректное присваивание.
2. Не корректная операция.
3. Не корректная передача параметров.
Ошибки выполнения:
1. Синхронные ошибки.
1. Ошибки определения данных.
1. Ошибки передачи.
2. Ошибки преобразования.
3. Ошибки перезаписи.
4. Ошибочные данные.
5. Динамический контроль типов.
6. Ошибки индексации.
2. Ошибки накопления погрешностей.
1. Игнорирование способов уменьшения погрешностей.
2. Переполнение разрядной сетки.
3. Арифметические ошибки.
4. Ссылочные ошибки.
5. Ошибки сети.
6. Ошибки ввода/вывода.
2. Асинхронные ошибки.
1. Ошибки виртуальной машины.
2. Ошибки системы.
Ошибки компоновки
1. Ошибки получения данных по внешним ссылкам.
2. Объединение модулей
1. Ошибки обнаружения модулей.
2. Ошибка состыковки списков параметров модулей.
Логические ошибки
1. Ошибки проектирования
1. Неприменимый метод.
2. Неверный алгоритм.
3. Неверная структура данных.
2. Ошибки кодирования
1. Некорректное вычисление.
2. Ошибки реализации алгоритмов.
Общий способ обработки ошибок.
1. При компиляции, компилятор производит анализ исходной программы, а затем синтез объектной программы.
Первоначально производится лексический анализ программы. Лексический анализатор просматривает строки слева направо и строит символы программы — целые числа, идентификаторы, служебные слова и т. д. Символы передаются затем на обработку cинтаксическому и семантическому анализатору, где производит проверку символов программы на синтаксические и семантические правила языка переводя программу во внутреннее представление. При обнаружении нарушения данных правил или обнаружению неизвестных команд, компилятор останавливает свою работу, выведя место обнаружения ошибки и ее тип.
2. В отсутствие собственного механизма обработки исключений в языках программирования, для программ, наиболее общей реакцией на любую исключительную ситуацию является немедленное прекращение выполнения с выдачей пользователю сообщения о характере исключения. Тогда можно утверждать, что тогда обработка исключений передается стандартному обработчику исключений системы в которой происходит выполнение.
Пример такого нарушения — попытка индексировать вне границ массива. Некоторые языки программирования и их реализации противодействуют таким ошибкам безоговорочным завершением программы; другие позволяют реагировать произвольным или непредсказуемым образом. Такие подходы не совместимы с задачами языка Java: обеспечивать мобильность и устойчивость к ошибкам.
Языки имеющие механизм обработки исключений имеют в наличии специальные конструкции для обработки ошибок. За исключением незначительных различий в синтаксисе, существует лишь пара вариантов обработки исключений. В наиболее распространённом из них исключительная ситуация генерируется специальным оператором (throw или raise), а само исключение, с точки зрения программы, представляет собой некоторый объект данных. То есть, генерация исключения состоит из двух этапов: создания объекта-исключения и возбуждения исключительной ситуации с этим объектом в качестве параметра. При этом конструирование такого объекта само по себе выброса исключения не вызывает. В одних языках объектом-исключением может быть объект любого типа данных (в том числе строкой, числом, указателем и так далее), в других — только предопределённого типа-исключения (чаще всего он имеет имя Exception) и, возможно, его производных типов (типов-потомков, если язык поддерживает объектные возможности).
Область действия обработчиков начинается специальным ключевым словом try или просто языковым маркером начала блока (например, begin) и заканчивается перед описанием обработчиков (catch, except, resque). Обработчиков может быть несколько, один за одним, и каждый может указывать тип исключения, который он обрабатывает. Если язык поддерживает наследование и типы-исключения могут наследоваться друг от друга, то обработкой исключения занимается первый обработчик, совместимый с исключением по типу.
Некоторые языки также допускают специальный блок (else), который выполняется, если ни одного исключения не было сгенерировано в соответствующей области действия. Чаще встречается возможность гарантированного завершения блока кода (finally, ensure).
3. Логические ошибки сложны в обнаружении и устранении, для данных целей, необходимо использовать отладчик, просматривать на ошибки блок-схему.
При этом сложноть отладки увеличивается под влиянием следующих факторов:
1. опосредованного проявления ошибок;
2. возможности взаимовлияния ошибок;
3. возможности получения внешне одинаковых проявлений разных ошибок;
4. отсутствия повторяемости проявлений некоторых ошибок от запуска к запуску;
5. написания отдельных частей программы разными программистами.