Тема 7.
Управление обменом и обработка исключительных ситуаций
Лекция 7.3.
Обработка исключений
Литература
Основная:
Павловская Т.А., Щупако Ю.А. C / C ++. Структурное программирование, Питер, 2005. – 402 с.
Дополнительная:
Гросс К. С# 2008: Пер. с. анг. – СПб. БХВ-Петербург, 2009. – 576 с.
Троелсен Э. Язык программирования С# 2005 и платформа /NET 2.0:пер. с анг. – М:. ООО «И.Д. Вильямс, 2007. – 1168 с.
Вопросы :
1. Ошибки и исключения.
2. Стандартная обработка исключений.
3. Программные средства обработки исключений.
1. Ошибки и исключения
Ошибки в программе:
- синтаксические ошибки;
- семантические ошибки;
- некорректность чужого кода;
- ошибки пользователя;
- нарушения технологии обработки;
- некорректная работа оборудования.
Для предотвращения или выявления ошибочных ситуаций в ходе выполнения программы применяются:
- средства разработчика;
- средства ОС. Например, Windows API содержит сотни кодов ошибок.
Указанные средства не обеспечивают единства в представлении сообщений об ошибках.
Обнаруживаются в ходе выполнения программы
Последствия проявления ошибок:
- невозможность решения задачи;
- утечка ресурсов;
- наличие «мусора» после выполнения программы;
- искажения хранимых данных, программ и т.д.
Часть ошибок система обходит, например, для вещественных чисел:
- при вычислении квадратного корня из отрицательной величины результатом является величина NaN ;
- при делении на 0 выдается результат бесконечность ;
- при вычислении логарифма нуля выдается результат отрицательная бесконечность .
При стандартных настройках проекта и работе с целыми числами слишком большое целочисленное значение урезается путем отбрасывания «лишних» старших цифр.
Но при этом понять где произошла ошибка не удается.
Для включения контроля за целочисленным переполнением:
а) «опасное» выражение заключают в конструкцию checked с круглыми скобками, например
int p = checked ((int) Math.Pow(a,b));
б ) группу «опасных» операторов заключают в фигурные с скобки
checked { оператор1 ; …; оператор N; }
Если среди указанных операторов есть обращения к методам, то внутри этих методов контроль за переполнением не производится.
Конструкция unchecked отключает контроль за целочисленным переполнением (отключение контроля ускоряет выполнение операций).
Добиться контроля за переполнением в операциях с вещественными числами невозможно .
Существенная часть ошибок времени выполнения (например, выход индекса за пределы массива ) преобразуются в исключения .
Исключение ( Exception ) – класс-потомок объекта System . При возникновении ошибки в ходе выполнения программы генерируется объект - исключение, который и содержит информацию о конкретной ошибке.
Способы обработки исключения:
стандартный ;
обработка в приложении .
2. Стандартная обработка исключений
Исключение прерывает нормальный ход программы и передает управление обработчику исключений .
При выполнении программы в среде VS вначале появляется сообщение системы, например
После выбора режима Не отправлять в окне приложения выдается сообщение системы с конкретизацией вида и места предполагаемой ошибки.
При выборе режима Отладка осуществляется:
- переход в окно для выбора отладчика,
- затем переход в окно отладчика с названием, содержащем вид исключения и напоминание, что это исключение не обработано.
В тексте программы выделяется оператор, при выполнении которого произошла ошибка, а в окне отладчика причина ошибки и перечень рекомендаций по ее устранению.
При запуске программы из операционной среды вначале также появляется окно с сообщением об обнаруженной ошибке, после нажатия кнопки Не отправлять программа завершается.
Пользователю переходить в режим отладки не имеет смысла.
3. Программные средства обработки исключений
Обработка исключений непосредственно в программе позволяет содержательно оценить ситуацию, связанную с появлением ошибок определенного типа, обеспечивает выдачу конкретной диагностической информации без аварийного завершения программы.
Разработчику следует предусмотреть типовые ошибочные ситуации, требующие повышенного внимания, и запрограммировать их обработку.
Класс Exception включает десятки свойств и методов, часть из которых является виртуальными, т.е. могут переопределяться.
Типы исключений
ArgumentException – вызов метода с недействительным аргументом
ArgumentOutOfRangeException – вызов метода с аргументом вне допустимого диапазона
ArthmeticException – арифметическая ошибка
FormatException – неправильный формат параметра (не число при вводе с консоли значения арифметической величины)
IndexOutOfRangeException – индекс массива выходи за допустимые пределы
OverFlowException – переполнение при арифметической операции над целыми числами
FileNotFoundException - файл не найден
e) { … } " width="640"
В языке С # применяются 4 ключевых слова ( try , catch , throw , finale ), с помощью которых генерируются и обрабатываются исключения.
Существуют несколько типовых конструкций обработки исключений.
Типовая конструкция 1:
try
{
…
}
catch ( тип исключения e)
{
…
}
e) { … } содержит код, выполняемый при возникновении исключения. Программист может предусмотреть содержательную обработку исключений или завершить выполнение программы. " width="640"
Ловушка исключений - блок try {… }
Фигурные скобки ограничивают строки кода, в которых ожидается появление исключений. Если обнаруживается исключение, то управление передается блоку catch .
Блок
catch ( тип исключения e)
{
…
}
содержит код, выполняемый при возникновении исключения. Программист может предусмотреть содержательную обработку исключений или завершить выполнение программы.
. Допускается опускать этот параметр и тем самым формировать обобщенный блок catch , реагирующий на исключения всех типов. При наличии нескольких блоков catch , в том числе и без параметра, этот обобщенный блок должен располагаться последним. " width="640"
Код программы может содержать несколько блоков catch , каждый из которых реагирует на исключения определенного типа, например исключения типа System.IndexOutOfRangeException или System.IO.DirectoryNotFoundException путем использования параметра тип исключения .
Допускается опускать этот параметр и тем самым формировать обобщенный блок catch , реагирующий на исключения всех типов. При наличии нескольких блоков catch , в том числе и без параметра, этот обобщенный блок должен располагаться последним.
Последовательность событий в программе:
- выполнение блока try останавливается в точке, где возникло исключение;
- отыскивается блок catch , соответствующий типу исключения. Если такого блока нет, но есть обобщенный блок catch , тогда он становится блоком обработки;
- начинает выполняться соответствующий блок обработки исключений;
- выполняется код программы, стоящий за всеми блоками catch .
- если блока обработки соответствующего типа исключения нет, тогда выполняется стандартная обработка.
e) переменная e является именем объекта-исключения. При наличии нескольких блоков catch для различных исключений в случае надобности выполняется только один из них. Конструкция e.GetType().Name + " " + e1.Message позволяет сформировать строку из имени типа исключения (формальное определение типа, например, FormatException ) и поясняющего текста (например, Входная строка имела неверный формат ). " width="640"
Если программа в рамках блока try не генерирует исключение, то блоки catch полностью пропускаются. В любом случае программа может продолжать выполняться, начиная с оператора, стоящего за блоками catch (если при обработке в блоке не предусмотрено другое). В блоке catch ( тип исключения e) переменная e является именем объекта-исключения.
При наличии нескольких блоков catch для различных исключений в случае надобности выполняется только один из них.
Конструкция
e.GetType().Name + " " + e1.Message
позволяет сформировать строку из имени типа исключения (формальное определение типа, например, FormatException ) и поясняющего текста (например, Входная строка имела неверный формат ).
Фрагмент кода
int[] mas1 = {1, 2, 3};
try
{
mas1[4] = 0;
}
catch (IndexOutOfRangeException e)
{
Console.WriteLine("Исключение={0}",e.Message);
}
Приведет к отображению на экране текста
Исключение= Индекс находится вне границ массива
Здесь Message свойство объекта, содержащее наименование исключения.
Типовая конструкция 2:
try
{
…
}
finally
{
…
}
В такой конструкции, если возникает исключение в блоке try , начинает выполняться код блока finally . После этого осуществляется стандартная обработка исключения. Если в блоке try исключения не возникают, то блок finally выполняется после блока try .
В блок finally целесообразно включать операторы, которые должны быть выполнены независимо от возникновения исключений (например, сохранение данных).
e 1 ) { … } catch ( тип исключения2 e 2 ) { … } . . . finally { … } Блок finally выполняется всегда – либо после блока try , если нет исключений, либо после блока catch . " width="640"
Типовая конструкция 3:
try
{
…
}
catch ( тип исключения1 e 1 )
{
…
}
catch ( тип исключения2 e 2 )
{
…
}
. . .
finally
{
…
}
Блок finally выполняется всегда – либо после блока try , если нет исключений, либо после блока catch .
) ; Например выполнение оператора throw (new System.Exception()); приведет к генерации исключения. " width="640"
В языке есть оператор искусственной генерации исключения:
throw (new тип исключения ) ;
Например выполнение оператора
throw (new System.Exception());
приведет к генерации исключения.
В системе содержится множество исключений, любое из которых программист может генерировать и обрабатывать в программе.
В VS предусмотрено специальное окно для просмотра и редактирования обработки исключений. Окно вызывается выполнением команды
Отладка – Исключения…- Common Language Runtime Exceptions .
Исключения можно конфигурировать с помощью флажков. Первый флажок Генерируется позволяет перейти в режим отладки даже в случае возникновения обрабатываемых исключений. Второй – чтобы игнорировались исключения, необработанные программно (но обычно все равно осуществляется переход в режим Break ).
Вопросы для самоподготовки
- Понятие и виды исключений.
- Способы обработки исключений.
- Сущность стандартной обработки исключений.
- Типовые программные конструкции обработки исключений.
- Назначение программных блоков try , catch , finale .
- Изучить постановку задачи на практическое занятие.
При отладке программ с массивами удобно использовать средства автоматического заполнения этих массивов случайными числами. Для этого используют класс Random из пространства имен System .
Конструкторы
Random r = new Random();
при каждом выполнении программы генерируется уникальная последовательность чисел;
Random r = new Random( 1 );
параметр задает начальное значение генератора, что обеспечивает получение одинаковых последовательностей чисел
Основные методы класса
Next (min, max) – возвращает целое положительное «случайное» число в диапазоне [min, max] ;
NextDouble() - возвращает вещественное положительное «случайное» число в диапазоне [0,1).
Пример использования класса
Random r = new Random();
Random r1 = new Random(1);
for (int i=0; i
{ mas1[i]=r.Next(10,100); }
for (int i=0; i
{ mas2[i]=r1.NextDouble(); }


Обработка исключений (541 KB)

