- •Глава 9. Многомерные массивы
- •9.1 Прямоугольные массивы
- •9.1.1 Объявления и инициализация
- •9.1.2 Примеры
- •9.2 Ступенчатые массивы
- •9.2.1 Объявления и инициализация
- •9.2.2 Примеры
- •9.3 Оператор цикла с перебором foreach
- •9.4 Массивы с числом размерностей больше двух
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
- •Глава 10. Исключительные ситуации
- •10.1 Основные понятия
- •10.2 Механизм обработки исключений
- •10.3 Примеры обработки исключений
- •10.4 Оператор throw
- •10.5 Дополнительные сведения
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
- •Глава 11. Обработка текстовой информации
- •11.1 Символьный тип char
- •11.2 Массив символов
- •11.3 Тип String
- •11.4 Класс StringBuilder
- •11.5 Форматирование строк
- •Контрольные вопросы
- •Варианты заданий для самостоятельной работы
10.3 Примеры обработки исключений
Пример 1.Оптимизировать программу, производящую простые арифметические операции над числами (сложение, умножение и деление), используя обработку исключительных ситуаций (обработка ввода чисел и операции деления).
Листинг 1
using System;
namespace ConsoleApplication
{
class OurClass
{
static void Main(string[] args)
{
float num1 = 1, num2 = 2, summarize, multiply, divide=0;
int k=0, l=0, d=0;
Console.Write("Введите первое число num1:");
try { num1 = float.Parse(Console.ReadLine()); }
catch
{
Console.WriteLine("Неправильный формат числа!\n" +
"В качестве значения первого числа будет 1");
}
Console.Write("Введите второе число num2:");
try { num2 = float.Parse(Console.ReadLine()); }
catch
{
Console.WriteLine("Неправильный формат числа!\n" +
"В качестве значения второго числа будет 2");
}
k = (int)num1;
l = (int)num2;
ummarize = num1 + num2; multiply = num1 * num2; divide = num1 / num2; ;
Console.WriteLine("num1 + num2 = " + summarize);
Console.WriteLine("num1 * num2 = " + multiply);
Console.WriteLine("num1 / num2 = " + divide);
Console.WriteLine("Целые \nk= " + k + " l= " + l);
try { d = k / l; }
catch (DivideByZeroException)
{
Console.WriteLine("d=k/l= ?");
Console.WriteLine("Нельзя делить на нуль! ");
Console.WriteLine("В качестве результата операции деления будет использовано значение 0");
}
Console.WriteLine("d=k/l="+d);
}
}
}
Ниже приведены три варианта результатов работы программы, обрабатывающие различные ситуации. Вариант 1 демонстрирует обработку исключения, возникающего при неправильном вводе числа num2.
Результаты работы программы вариант 1:
Вариант 2 содержит выводимую информацию в случае, когда программа работает так, что не генерируется ни одно исключение и, следовательно, все обработчики исключений программы игнорируются.
Результаты работы программы вариант 2:
Третий вариант запуска программы демонстрирует перехват исключения DivideByZeroException, генерируемого в ответ на попытку деления целого числа на нуль.
Результаты работы программы вариант 3:
Рассмотрим еще один пример программы, где обрабатывается исключение другого типа. Вернемся к программе поиска наибольшего элемента в массиве, уже рассмотренной в предыдущей главе. Внесем в заголовок последнего цикла следующее изменение:
for (int i = 0; i < n+1; ++i),
где индекс iвыходит за правую границу объявленного диапазона, поскольку изменение индекса массива предусмотрено только от 0 до 5. При попытке использования индекса, равного 6, генерируется исключениеIndexOutOfRangeException. Для перехвата этого исключения сделаем этот цикл внутренним блоком оператораtry,за которым поместим следующуюcatch-инструкцию:
catch (IndexOutOfRangeException)
{
Console.WriteLine("Выход индекса за пределы диапазона");
}
Данная catch-инструкция перехватывает указанное исключение и выводит необходимое сообщение.
Пример 2.Поиск наибольшего элемента в одномерном массиве.
Листинг 2 – Поиск максимального элемента в одномерном массиве
using System;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
const int n = 6;
int[] a = new int[n] { 3, 12, 5, -9, 8, -4 };
Console.WriteLine("Исходный массив:");
for (int i = 0; i < n; ++i)
Console.WriteLine("\t" + a[i]);
Console.WriteLine();
int max = a[0];
try
{
for (int i = 0; i < n+1; ++i)
if (a[i] > max)
max = a[i];
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("Выход индекса за пределы диапазона");
}
Console.WriteLine("Максимальный элемент = " + max);
Console.Read();
}
}
}
Результаты работы программы:
Как же будет работать программа, если перехват данного исключения в ней отсутствует? Ответ один: это исключение все же будет перехвачено, но уже системой исполнения программы языка, которая выдаст сообщение об ошибке и прекратит выполнение программы: