Использование ключевых слов checked и unchecked
По умолчанию исключение OverflowException не генерируется. С# по- зволяет управлять генерированием исключений при возникновении пе- реполнения с помощью ключевых слов checked и unchecked, которые должны находиться в try-блоке.
Чтобы указать, что некоторое выражение должно быть проконтроли- ровано на предмет переполнения, используйте ключевое слово checked. А чтобы проигнорировать переполнение, используйте ключевое слово unchecked. В последнем случае результат будет усечен так, чтобы его тип соответствовал типу результата выражения. Режим unchecked дейст- вует в настройке среды VS по умолчанию.
Ключевое слово checked имеет две формы. Одна проверяет конкрет- ное выражение и называется операторной checked-формой. Другая же проверяет блок инструкций.
Формат:
checked (выражение)
или
checked
{
// Инструкции, подлежащие проверке.
}
Если значение контролируемого выражения переполнилось, генери- руется исключение типа OverflowException.
Ключевое слово unchecked имеет две формы. Одна из них — опера- торная форма, которая позволяет игнорировать переполнение для за-
данного выражения. Вторая игнорирует переполнение, которое возмож- но в блоке инструкций.
Формат:
unchecked (выражение)
или
unchecked
{
// Инструкции, для которых переполнение игнорируется.
}
В случае переполнения выражение усекается:
byte a=127, b=127, result;
try {
result = checked ( (byte)(a*b) ); // инструкция вызовет
} // исключение.
Примеры. Определить в программе несколько вещественных пере- менных. Ввести с клавиатуры их значения. В случае ввода неверных данных, используя блоки try и catch, реализовать повторный ввод.
Вариант 1. Для большого количества вводимых данных. Один блок try и один блок catch на все операции ввода. После обработки исключения повторяется весь выполненный ввод, включая правильный, заново. Этот вариант хорош для отладки, но не для итоговой программы.
using System; class TestTryCatch
{
public static void Main()
{
double a, b, c;
while (true)
{
try
{
}
Console.Write("Введи первое вещественное число:"); a = double.Parse(Console.ReadLine());
Console.Write("Введи второе вещественное число:"); b = double.Parse(Console.ReadLine());
Console.Write("Введи третье вещественное число:"); c = double.Parse(Console.ReadLine());
break;
catch
{
Console.WriteLine("\nВведено неверное данное! " + " Повторите весь ввод заново.\n");
// continue; //нужен, если после catch в этом
// цикле следует какая-либо обработка
}
} // while-end
Console.WriteLine("Ввод закончен!\n");
// далее основная часть программы
. . .
}
}
Вариант 2. Блоки try и catch на каждый оператор ввода. Самый про- стой вариант, но при большом количестве вводимых данных – самый длинный.
using System; class TestTryCatch
{
public static void Main()
{
double a, b;
while (true)
{
Console.Write("Введи первое вещественное число:"); try
{
a = double.Parse(Console.ReadLine()); break;
}
catch
{
Console.WriteLine("\nВведено неверное данное!\n");
}
}
while (true)
{
Console.Write("Введи второе вещественное число:"); try
{
b = double.Parse(Console.ReadLine()); break;
}
catch
{
Console.WriteLine("\nВведено неверное данное!\n");
}
}
Console.WriteLine("Ввод закончен!\n");
// далее основная часть программы
. . .
}
}
Вариант 3. Для большого количества вводимых данных. Один блок try и один блок catch на все операции ввода. Запоминается номер ошибоч- ного ввода. После обработки исключения повторяется только последний ошибочный ввод.
using System; class TestTryCatch
{
public static void Main()
{
double a, b, c; bool rep=true;
int n=1; // номер неудачного ввода
while (rep==true)
{
try
{
switch (n)
{
case 1:
Console.Write("Введи первое вещественное число:"); a = double.Parse(Console.ReadLine());
n = 2; // N следующего ввода
break; case 2:
Console.Write("Введи второе вещественное число:"); b = double.Parse(Console.ReadLine());
n = 3;
break; case 3:
Console.Write("Введи третье вещественное число:"); c = double.Parse(Console.ReadLine());
n = 1; // для повтора программы
rep = false; // для выхода из цикла while break;
}
}
catch
{
Console.WriteLine("\nВведено неверное данное!\n");
//continue; //если после catch в этом цикле следует обработка
}
} // while-end
rep=true; // для повтора программы
Console.WriteLine("Ввод закончен!\n");
// далее основная часть программы
. . .
}
}
© ООО «Знанио»
С вами с 2009 года.