
Министерство образования и науки РФ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ
УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
ГЕНЕРИРОВАНИЕ И ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
Отчет по лабораторной работе №4
по дисциплине «Языки программирования»
Выполнил: Студент гр.520-2
________ Терентьев Д.С.
«____» _________ 2013 г.
Принял: Доцент каф. КИБЭВС
___________ Романов А.С.
«____» _________ 2013 г.
2013
1 Введение
Целью данной работы является изучение видов исключительных ситуаций и способов их обработки.
2 Задание
1) Разработать программу, генерирующую исключительную ситуацию, и обрабатывающую вызванное исключение.
2) Доработать пример кода, реализующего схему Б. Мейера так, чтобы угроза исключения зависела от значения генерируемого случайного числа, а обработчик исключения мог изменять границы интервала, повышая вероятность успеха.
3 Краткая теория
Исключительные ситуации
Исключительные ситуации – это ситуации, возникающие во время выполнения программы, не позволяющие корректно выполнять вычисляемые действия. Виды исключений:
-
Ошибка ограничений (Constrain_Error) – выход за пределы диапазона.
-
Ошибка памяти (Storage_Error) – недостаточность памяти.
-
Программная ошибка (Program_Error) – нарушение правил языка.
-
Ошибка задачи (Tasking_Error) – ошибки, возникающие при взаимодействии задач.
Семантика обработки исключений:
1. Если исключительная ситуация не обработана внутри процедуры, попытка ее выполнения оставляется, и исключительная ситуация снова возбуждается в точке вызова.
2. Если исключительная ситуация возбуждается во время выполнения обработчика, а обработчик оставляется, то исключение снова возбуждается в точке вызова.
3. Возможен выбор: возбудить то же самое исключение или другое в точке вызова.
Базовая технология обработки исключений в С++ заключается в использовании триады try…throw…catch. Нормальная ситуация обрабатывается кодом, следующим за ключевым словом try, а код, располагающийся за ключевым словом catch, выполняется только в исключительных случаях. Выбрасывание осуществляется с помощью оператора throw. При выбросе исключения выполнение блока try останавливается и начинается выполнение блока catch (обработчика исключения).
4 Ход работы
4.1. Напишем функцию, которая производит деление двух чисел:
static void M(int x, int z) { Console.WriteLine(x / y); }
Если ввести значение у = 0, то происходит деление на нуль и программа завершится с ошибкой, как показано на рисунке 4.1.1:
Рисунок 4.1.1 – Демонстрация работы функции.
Для того, чтобы программа не прекращала работу из-за данной функции доработаем её, добавив обработчик исключений:
static int M()
{
try
{
Console.Write("Введите параметры\n");
Console.Write("x=");
int x = int.Parse(Console.ReadLine());
Console.Write("y=");
int y = int.Parse(Console.ReadLine());
Console.WriteLine(x / y);
}
catch (DivideByZeroException)
{
Console.WriteLine("Делить на нуль нельзя!");
return M();
}
return 0;
}
Данный вариант не будет завершать работы программы при вводе данных при которых происходит деление на нуль, а будет постоянно предупреждать и просить повторения ввода новых параметров. Пример работы представлен на рисунке 4.1.2:
Рисунок 4.1.2 – работа функции с обработчиком исключений.
4.2. Схема Бертана Мейера
static int M()
{
Console.Write("Введите числа от 1 до 10\n");
Console.Write("x=");
string str1 = Console.ReadLine();
Console.Write("y=");
string str2 = Console.ReadLine();
int x, y, f;
x = Convert.ToInt32(str1);
y = Convert.ToInt32(str2);
bool success = true;
do
{
try
{
bool danger = false;
danger = CheckDanger(x, y);
f = x / y;
if (x < 1 || x > 10) throw new ArgumentOutOfRangeException("Число должно быть от 1 до 10!!! ");
if (y < 1 || y > 10) throw new ArgumentOutOfRangeException("Число должно быть от 1 до 10!!! ");
}
catch (DivideByZeroException)
{
Console.WriteLine("Делить на нуль нельзя!");
return M();
}
catch (ArgumentOutOfRangeException)
{
while (CheckDanger(x, y))
{
if (x < 1 || x > 10) x = x / 2;
else y = y / 2;
}
return(x / y);
}
}
while (!success);
return (x/y);
}
static bool CheckDanger(int x, int y)
{
try
{
if (x < 1 || x > 10) throw new ArgumentOutOfRangeException("Число должно быть от 1 до 10!!! ");
if (y < 1 || y > 10) throw new ArgumentOutOfRangeException("Число должно быть от 1 до 10!!! ");
return (false);
}
catch
{
return (true);
}
}
Рисунок 4.2.1 – Работа функции со схемой обработки исключений Б. Мейера
5 Заключение
В ходе выполнения данной лабораторной работе мы ознакомились с исключительными ситуациями возникающими при выполнении программы, написали программу в которой могут возникать исключительные ситуации связанные с входными данными, и реализовали обработчики исключений.