ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 3208
Скачиваний: 1
В оригинальном издании книги эти главы были помещены на прила гаемый к книге компакт-диск. В русском издании книги их решено опубликовать в виде отдельной, дополнительной части.
Глава 18
Эти исключительные исключения
> Обработка ошибок с помощью кодов ошибки
УИспользование механизма исключений вместо кодов ошибки
}Создание собственного класса исключения
}Перекрытие ключевых методов в классе исключения
не сомнения, трудно смириться с тем, что иногда метод (или функция) не делает то, для чего он предназначался. Это раздражает программистов ничуть не меньше, чем пользователей их программ, тоже часто являющихся источником недоразу мений. В книге встречалась программа, в которой пользователь должен был вводить це лое число как строку. Такой метод можно написать так, что он будет просто игнориро вать введенный пользователем мусор вместо реального числа, но хороший программист напишет функцию таким образом, чтобы она распознавала неверный ввод пользователя
и докладывала об ошибке.
Здесь говорится об ошибках времени выполнения, а не времени компиляции, с кото рыми С# разберется сам при сборке вашей программы.
Механизм исключений представляет собой средство для сообщения о таких ошибках способом, который вызывающая функция может лучше понять и использовать для реше ния возникшей проблемы.
Промолчать о том, что произошла ошибка времени выполнения — это всегда наи худшее решение, применимое только в том случае, если вы не намерены отлаживать программу и вас не интересует результат ее работы...
В приведенной далее демонстрационной программе FactorialWithEr- r o r показано, что может произойти, если не выявить ошибку. Эта програм ма вычисляет и выводит значение факториала для ряда значений.
Факториал числа N равен N*(N-l)*(N-2)*... *1. Например, факториал 4 равен 4*3*2*1 = 24. Функция вычисления факториала работает только для поло жительных целых чисел. Это банальный программистский пример для ил люстрации ситуации, когда требуется обработка ошибок.
//FactorialWithError - пример функции вычисления
//факториала, в которой отсутствует проверка ошибок
using System;
namespace FactorialWithError
{
//MyMathFunctions - набор созданных мною математических
//функций
public class MyMathFunctions
{
//Factorial - возвращает факториал переданного
//аргумента
public static double Factorial(double dValue)
{
//Начинаем со значения аккумулятора, равного 1 double dFactorial = 1.0;
//Цикл со счетчиком nValue, уменьшающимся до 1, с
//умножением на каждой итерации значения аккумулятора
//на величину счетчика
do
{
dFactorial *= dValue; dValue -= 1.0;
} while(dValue > 1);
// Возвращаем вычисленное значение return dFactorial;
}
}
public class Program
{
public static void Main(string[] args)
{
//Вызов функции вычисления факториала в
//цикле от 6 до -6
for (int i = 6; i > -6; I--)
{
// Вывод результата на каждой итерации Console.WriteLine("i = { о } , факториал = {l}",
i, MyMathFunctions.Factorial(i));
}
// Ожидаем подтверждения пользователя Console.WriteLine("Нажмите <Enter> для " +
"завершения программы.. . ") ;
Console.Read();
}
}
}
Функция Factorial () начинается с инициализации переменной-аккумулятора значе нием 1. Затем функция входит в цикл, в котором на каждой итерации выполняется умноже ние на последовательно уменьшающееся значение счетчика nValue, пока nValue не дос тигнет 1. Накопленное в аккумуляторе значение возвращается вызывающей функции.
Алгоритм Factorial () выглядит корректно— пока вы не начнете вызывать эту функцию. Функция Main () также содержит цикл, в котором вычисляются значения фак ториала для ряда убывающих значений. Однако вместо того чтобы остановиться на значе нии394 1, функция Main () продолжает вычисления для отрицательныхЧасть VII. Дополнительныезначе й — д -6.главы
jjjdWfeK Указанные изменения внесены в код демонстрационной программы Facto
//FactorialErrorReturn - создание функции вычисления
//факториала, которая возвращает код ошибки, если что-то
//идет не так
using System;
namespace FactorialErrorReturn
{
//MyMathFunctions - набор созданных мною математических
//функций
public class MyMathFunctions
{
//Следующие коды ошибок представляют некорректные
//значения
public |
const |
int NEGATIVE_NUMBER = |
-1; |
public |
const |
int NON_INTEGER_VALUE = |
-2; |
//Factorial - возвращает факториал переданного
//аргумента
public static double Factorial(double dValue)
{
// Проверка: отрицательные значения запрещены if (dValue < 0)
{
return NEGATIVE NUMBER;
}
// Проверка: передано ли целое значение аргумента int nValue = (int)dValue;
if (nValue != dValue)
{
return NON INTEGER VALUE;
}
//Тесты пройдены, начинаем со значения аккумулятора,
//равного 1
double dFactorial = 1.0;
//Цикл со счетчиком nValue, уменьшающимся до 1, с
//умножением на каждой итерации значения аккумулятора
//на величину счетчика
do
{
dFactorial *= dValue; dValue -= 1.0;
} while(dValue > 1);
// Возвращаем вычисленное значение return dFactorial;
}
}
public class Program
{
public static void Main(stririg[] args)
396 { |
Часть VII. Дополнительные главы |
//Вызов функции вычисления факториала в
//цикле от 6 до -6