Шаг 234.
Язык программирования C#. Начала.
Обработка исключений. Примеры использования
На этом шаге мы рассмотрим несколько примеров решения задач, в которых используется обработка исключений.
Здесь мы рассмотрим несколько программ, в которых используются рассмотренная на предыдущих шагах обработка исключений.
Задание 1.
Напишите программу, в которой уравнение вида Ах = B решается на множестве целых чисел. Решением является такое целое число х, которое, будучи умноженным на целое число A, дает целое число B.
Решение существует только в том случае, если целое число B без остатка делится на целое число A или если оба параметра A и B равны нулю.
Предусмотреть обработку исключительных ситуаций.
Раскрыть/скрыть решение и комментарии.
Приведем сначала текст программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pr234_1
{
class Program
{
static void Main()
{
// Коэффициенты уравнения:
int A = 0, B = 0;
// Контролируемый код:
try
{
Console.WriteLine("Задайте коэффициенты уравнения Ax = B, сначала A, потом B");
A = Convert.ToInt32(Console.ReadLine());
B = Convert.ToInt32(Console.ReadLine());
// Если результат деления не целое число...
if (B % A != 0)
// ... генерируем исключение
throw new ArithmeticException("Результат - не целое число");
Console.WriteLine(A + " * " + B / A + " = " + B);
}
catch (DivideByZeroException)
{
// Возникает при A = 0:
if (B == 0)
Console.WriteLine("Результат - любое число");
else
Console.WriteLine("На 0 делить нельзя");
}
catch (ArithmeticException e)
{
// Обрабатывает ситуацию, когда результат -
// число дробное
Console.WriteLine(e.Message);
}
catch (Exception)
{
// Обрабатывает ситуацию, когда введена
// хотя бы одна строка
Console.WriteLine("Введена, как минимум, одна строка");
}
// Задержка:
Console.ReadLine();
}
}
}
Архив проекта можно взять
здесь.
Результат работы приложения при различных значения коэффициентов A и B приведен на рисунке 1.
Рис.1. Результат работы приложения
Обратим внимание на несколько моментов.
Здесь реализовано три обработчика исключений, порядок следования которых очень важен! Исключение DivideByZeroException является дочерним по отношению к
ArithmeticException, поэтому располагается перед ним, а самым общим является исключение Exception, обработчик которого располагается последним.
Если остаток от деления B на A не равен 0, то генерируется исключение типа ArithmeticException, в обработчике которого конструкцией
Console.WriteLine(e.Message);
выводится фраза
"Результат - не целое число". Отметим, что это единственный обработчик, которому передается параметр (
e); все остальные используются без параметров.
Отметим, что для компиляции программы, мы были вынуждены задать первоначальные значения коэффициентам A и B, в противном случае компиляция приложения не выполнялась.
Последний обработчик срабатывает тогда, когда возникает ошибка преобразования заданных строк в целые сила при выполнении конструкций
A = Convert.ToInt32(Console.ReadLine());
B = Convert.ToInt32(Console.ReadLine());
Задание 2.
Напишите программу, содержащую статический метод, не возвращающий результат. Аргументом методу передается целое число. Если число четное, то метод генерирует исключение класса
ArithmeticException, а если число нечетное, то генерируется исключение класса
OverflowException. В главном методе выполняется конструкция цикла, в которой на каждой
итерации пользователь вводит целое число, оно передается аргументом методу. Организовать обработку событий таким образом, чтобы в результате появлялось сообщение о том, четное число
или нечетное. Цкл должен завершать работу, если пользователь вводит не число.
Раскрыть/скрыть решение и комментарии.
Программа, реализующая данную задачу, выглядит достаточно простой. Плюсом ее является тот факт, что в тексте условия
прописана структура программы. Ее текст может быть таким:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pr234_2
{
class Program
{
// Статический метод:
static void MyMethod(int x)
{
// Проверка на четность:
if (x % 2 == 0)
// Генерация исключения, если число четное:
throw new ArithmeticException(x + " - число четное");
else
// Генерация исключения, если число нечетное:
throw new OverflowException(x + " - число нечетное");
}
// Главный метод:
static void Main()
{
Console.WriteLine("Вводите числа по-одному:");
while (true)
{
try
{
// Перевод строки в число:
int x = Convert.ToInt32(Console.ReadLine());
// Вызов метода:
MyMethod(x);
}
// Важен порядок следования исключений!
catch (OverflowException e)
{
// Обработка исключения соответствующего типа:
Console.WriteLine(e.Message);
}
catch (ArithmeticException e)
{
// Обработка исключения соответствующего типа:
Console.WriteLine(e.Message);
}
catch (Exception e)
{
// Обработка исключения, возникшего при невозможности
// перевода строки в число:
Console.WriteLine("Программа закончила свою работу!");
break;
}
}
// Задержка:
Console.ReadLine();
}
}
}
Архив проекта можно взять
здесь.
Результат работы приложения изображен на рисунке 2.
Рис.2. Результат работы приложения
Надеемся, что приведенный текст программы не вызвал затруднений.
Задание 3.
Напишите программу, в которой описывается класс для ошибки пользовательского типа. У класса должно быть поле, являющееся ссылкой на символьный массив. В качестве аргумента конструктору
класса передается целое число, определяющее размер массива. Массив заполняется последовательностью букв (например, начиная с буквы
'A'). В главном методе программы для реализации
символьного массива создается объект исключения пользовательского класса. Для отображения содержимого массива искусственно генерируется исключение, а обработка исключения сводится к
отображению содержимого массива из объекта исключения.
Раскрыть/скрыть решение и комментарии.
В качестве основы для решения этой задачи мы взяли текст программы, приведенной на 226 шаге, и немного его переделали. Вот этот текст:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pr234_3
{
// Класс исключения:
class MyException : Exception
{
// Закрытая ссылка на символьный массив:
private char[] ch;
// Конструктор создания объекта исключения:
public MyException(int n) :
base()
{
// Заполнение массива
ch = new char[n];
for (int i = 0; i < n; i++)
ch[i] = (char)('A' + i);
}
// Переопределение метода ToString():
public override string ToString()
{
string txt = "Содержание массива ch:\n";
for (int i = 0; i < ch.Length; i++)
txt += ch[i] + " ";
return txt;
}
}
class Program
{
// Главный метод:
static void Main()
{
// Контролируемый код:
try
{
// Генерация пользовательского исключения:
throw new MyException(7);
}
// Перехват и обработка исключения:
catch (Exception e)
{
Console.WriteLine(e);
}
// Задержка:
Console.ReadLine();
}
}
}
Архив проекта можно взять
здесь.
Результат работы приложения приведен на рисунке 3.
Рис.3. Результат работы приложения
Отметим, что здесь требовалось привести в соответствие с текстом условия задачи, содержание класса MyException.
Со следующего шага мы начнем знакомиться с многопоточным программированием.
Предыдущий шаг
Содержание
Следующий шаг