Функции, помещаемые в библиотеку *.Dll
Таблица 6.1
№ варианта | № функций | № варианта | № функций | № варианта | № функций |
1, 15 | 5, 12 | 1, 10 | |||
2, 14 | 6, 11 | 2, 9 | |||
3, 12 | 7, 10 | 3, 8 | |||
4, 11 | 8, 9 | 4, 7 | |||
5, 10 | 3, 15 | 5, 6 | |||
6, 9 | 4, 14 | 2, 13 | |||
7, 8 | 5, 13 | 3, 12 | |||
2, 15 | 6, 12 | 4, 11 | |||
3, 14 | 7, 11 | 5, 10 | |||
4, 13 | 8, 10 | 6, 9 |
Лабораторная работа № 7
Обработка исключительных ситуаций в Visual C#
7.1. Цель работы
Ознакомление с классом исключительных ситуаций Visual C# и выработ- ка навыков создания приложений, осуществляющих обработку возникающих исключительных ситуаций
7.2. Теоретические сведения
Любое взаимодействие программы с операционной системой (ОС) на предмет получения ее ресурсов (открытия файла, места в оперативной памяти и т.п.) может окончиться неудачно. Выполнение любого вычисления может окончиться делением на нуль или переполнением. Платой за надежную работу программы в таких условиях является введение многочисленных проверок, га- рантирующих надежную работу программы при возникновении внештатных ситуаций. Как правило, бывает недостаточно просто в очередной конструкции условного перехода (типа if… then) поставить оператор выхода exit, а требу- ется отменить целую последовательность действий, предшествующих некор- ректному. Код программы, осуществляющий эти действия, будет маскировать четкую структуру главного алгоритма и приводить к ухудшению читабельности программы. Выход из данной ситуации был предложен разработчиками ОС Windows NT и получил название структурной обработки исключительных си- туаций (ИС). Позднее его поддержка была введена во все ОС, а также в среды разработки программ.
Исключительная ситуация, или исключение, - это возникновение аварий- ного события, которое может порождаться некорректным использованием ап-
паратуры или неправильной работой программы, например делением на ноль или переполнением. Обычно эти события приводят к завершению программы с системным сообщением об ошибке. С# дает программисту возможность вос- становить работоспособность программы и продолжить ее выполнение. Ис- ключения С# не поддерживают обработку асинхронных событий, таких как ошибки оборудования или прерывания, например нажатия клавиш Ctrl^C. Ме- ханизм исключений предназначен только для событий, которые могут произой-
ти в результате работы программы и указываются явным образом. Исключения возникают тогда, когда некоторая часть программы не смогла сделать то, что от нее требовалось. При этом другая часть программы может сделать что-нибудь иное.
Исключения позволяют логически разделить вычислительный процесс на две части – обнаружение аварийной ситуации и ее обработку. Это важно не
только для лучшей структуризации программы. Главное то, что функция, обна- ружившая ошибку, может не знать, что предпринимать для ее исправления, а использующий эту функцию код может знать, что делать, но не уметь опреде- лить место возникновения. Это особенно актуально при использовании библио-
течных функций и программ, состоящих из многих модулей. Другое достоинст- во исключений состоит в том, что для передачи информации об ошибке в вы- зывающую функцию не требуется применять возвращаемое значение или пара- метры, поэтому заголовки функций не разрастаются.
Исключения генерирует либо среда выполнения, либо программист с по-
мощью оператора throw. Наиболее часто используемые предопределенные ис- ключительные ситуации в C# следующие:
ArithmeticException – ошибка в арифметических операциях или преобразованиях (является предком DivideByZeroException и OverFlo- wException);
ArrayTypeMismatchException – попытка сохранения в массиве элемента несовместимого типа;
DivideByZeroException – попытка деления на ноль;
FormatException – попытка передать в метод аргумент неверного формата;
IndexOutOfRangeException – индекс массива выходит за границы диапазона;
InvalidCasrException – ошибка преобразования типа;
OutOfMemoryException – недостаточно памяти для создания нового объекта;
OverFlowException – переполнение при выполнении арифметических операций;
StackOverFlowException – переполнение стека.
Все перечисленные исключения определены в пространстве имен System. Все они являются потомками класса SystemException. Исключе- ния обнаруживаются и обрабатываются оператором try, который имеет сле- дующий синтаксис:
try блок [блоки catch] [блок finally]
Отсутствовать могут либо блоки catch, либо блок finally, но не оба
одновременно. Оператор try содержит три части:
1) контролируемый блок – составной оператор, предваряемый ключе-
вым словом try. В контролируемый блок включаются потенциально опасные операторы программы. Все функции, прямо или косвенно вызываемые из бло- ка, также считаются ему принадлежащими.
2) один или несколько обработчиков исключений - блоков catch, в которых описывается, как обрабатываются ошибки различных типов.
3) блок завершения finally выполняется независимо от того, возникла ошибка в контролируемом блоке или нет.
Алгоритм обработки исключения выглядит следующим образом:
1. Обработка исключения начинается с появления ошибки. Функция или операция, в которой возникла ошибка, генерирует исключение. Как правило,
исключение генерируется не непосредственно в блоке try, а в функциях, пря- мо или косвенно в него вложенных.
2. Выполнение текущего блока прекращается, отыскивается соответст- вующий обработчик исключения и ему передается управление.
3. Выполняется блок finally, если он присутствует (этот блок выпол- няется и в том случае, если ошибка не возникла).
4. Если обработчик не найден, вызывается стандартный обработчик ис-
ключения. Его действия зависят от конфигурации среды. Обычно он выводит на экран окно с информацией об исключении и завершает текущей процесс.
Обработчики исключений должны располагаться непосредственно за
блоком try. Они начинаются с ключевого слова catch, за которым следует в скобках тип обрабатываемого исключения. Можно записать один или несколь- ко обработчиков в соответствии с типами обрабатываемых исключений. Блоки catch просматриваются в том порядке, в котором они записаны, пока не будет найден соответствующий типу сгенерированного исключения. Существуют три формы записи обработчиков catch:
catch (тип имя) { …// тело обработчика} catch (тип) {… // тело обработчика} catch () {… // тело обработчика}
Первая форма применяется, когда имя параметра используется в теле об-
работчика для выполнения каких-либо действий, например вывода информации об исключении. Вторая форма не предполагает использования информации об исключении, играет роль только его тип. Третья форма применяется для пере- хвата всех исключений.
При генерации ИС их обработчики просматриваются в порядке их распо-
ложения в программе. Поэтому обработчик третьего типа следует помещать только после всех остальных. Также следует учитывать, что если обработчик ИС родительского класса будет стоять перед обработчиком ИС дочернего клас- са, то последний в этом случае не получит управления. Если исключения в за- щищаемом блоке не возникло, то все обработчики пропускаются.
В любом случае, произошло исключение или нет, управление передается
в блок завершения finally (если он существует), а затем первому оператору, находящемуся непосредственно за оператором try. В завершающем блоке обычно записываются операторы, которые необходимо выполнить независимо от того возникло исключение или нет. Обычно в этот блок помещают операто- ры, освобождающие ресурсы, выделяемые ОС программе, поэтому он еще ино- гда называется блоком защиты ресурсов.
Операторы try могут быть многократно вложены друг в друга. Исклю- чение, которое возникло во внутреннем блоке try и не было перехвачено соот- ветствующим блоком catch, передается на верхний уровень, где продолжается поиск подходящего обработчика. Если на внутреннем уровне недостаточно ин- формации для того, чтобы провести полную обработку ошибки, программист может выполнить частичную обработку и сгенерировать исключение повторно,
чтобы оно было обработано на верхнем уровне. Генерация исключения выпол- няется при помощи оператора throw, который имеет следующий синтаксис:
throw[выражение]
Конструкция без параметра применяется только внутри блока catch для повторной генерации исключения. Тип выражения, стоящего после throw, оп- ределяет тип исключения, например:
throw new DivideByZeroException();
Здесь после оператора throw записано выражение, создающее объект
стандартного класса «ошибка деления на 0» с помощью оператора new.
При использовании throw с параметром, последний должен быть объек- том, порожденным от стандартного класса System.Exception и опреде- ляющим вид исключения. Этот объект используется для передачи информации об исключении его обработчику.
При генерации исключения выполнение текущего блока прекращается и происходит поиск соответствующего обработчика с передачей ему управления. Обработчик считается найденным, если тип объекта, указанного после throw, либо тот же, что задан в параметре catch, либо является производным от не- го.
7.3. Программа работы
Добавить в программу калькулятора с динамически подключаемыми биб- лиотеками из второй лабораторной работы обработку возможно возникающих
в ней исключительных ситуаций (деления на ноль, ввода чисел вместо цифр,
отсутствия динамически подключаемой библиотеки и т.д.).
Лабораторная работа № 8 (дополнительная)