logo search
Ответы Госы_3

46. Программирование "с защитой от ошибок".

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

Детальный анализ ошибок и их возможных ранних проявлений показывает, что целесообразно проверять:

- правильность выполнения операций введения-выведения;

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

Для защиты от ошибок превращения даны после введения обычно сразу демонстрируют пользователю ("отголосок").При этом выполняют сначала превращения во внутренний формат, а потом назад.

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

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

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

- если любым образом вычисляется индекс элемента массива, то следует проверить, что этот индекс является допустимым;

- если строится цикл, количество повторений которого определяется значением переменной, то целесообразно убедиться, что значение этой переменной не негативно;

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

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

- избегать вычитания близких чисел (машинный нуль);

- избегать разделения больших чисел на малые;

- складывание длинной последовательности чисел начинать с меньших по абсолютной величине;

- стремиться по возможности уменьшать количество операций;

- использовать методы с известными оценками погрешностей;

- не использовать условие равенства вещественных чисел;

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

Для перехвата и обработки аппаратно и программно фиксированных oшібок в некоторых языках программирования, например, Delphi Pascal, C Java, предвиденные средства обработки исключений. Использования эти средств позволяет не допустить выдаче пользовательские сообщения об аварийном завершении программы, ничего ему не говорит. Вместо этого программист получает возможность предусмотреть действия, которые позволяют исправить эту ошибку или, если это невозможно, выдать пользовательские сообщения с точным описанием ситуации и продолжить работу.