По умолчанию исключение 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");
// далее основная часть программы
. . .
}
}
Дата: 2019-02-02, просмотров: 258.