Функции, помещаемые в библиотеку *.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 (дополнительная)

Наши рекомендации