Обработка исключений
Операторы checked и unchecked
В С# предусмотрено специальное средство, которое связано с генерированием исключений, вызванных переполнением результата в арифметических вычислениях. Например, когда значение арифметического выражения выходит за пределы диапазона, определенного для типа данных выражения. Рассмотрим небольшой фрагмент программы:
static void Main()
{
byte x = 200; byte y = 200;
byte result = (byte) (x + y);
Console.WriteLine(result);
}Здесь сумма значений а и b превышает диапазон представления значений типа byte. Следовательно, результат данного выражения не может быть записан в переменную result, тип которой byte.
Для управления подобными исключениями в С# используются операторы checked и unchecked. Чтобы указать, что некоторое выражение должно быть проконтролировано на предмет переполнения, используйте ключевое слово checked. А чтобы проигнорировать переполнение, используйте ключевое слово unchecked. В последнем случае результат будет усечен так, чтобы его тип соответствовал типу-результату выражения.
Можно задать (или отключить) проверку переполнения сразу для всего проекта. Для этого необходимо выполнить следующие действия
- Щелкнуть правой кнопкой мыши на имени проекта
- В выпадающем меню выбрать Properties
- В появившемся окне (см. рис.) выбрать слева страницу Build
- Щелкнуть на кнопке Advanced
- В появившемся окошке поставить или убрать галочку напротив Check for arithmetic overflow/underflow property.
Оператор checked имеет две формы:
- проверяет конкретное выражение и называется операторной checked-формой
checked ((тип-выражения) expr)
где expr — выражение, значение которого необходимо контролировать. Если значение контролируемого выражения переполнилось, генерируется исключение типа OverflowException.
- проверяет блок инструкций
checked { // Инструкции, подлежащие проверке. }
Оператор unchecked также имеет две формы:
- операторная форма, которая позволяет игнорировать переполнение для заданного выражения
unchecked ((тип-выражения) expr)
где ехрr — выражение, которое не проверяется на предмет переполнения. В случае переполнения это выражение усекается.
- игнорирует переполнение, которое возможно в блоке инструкций
unchecked { // Инструкции, для которых переполнение игнорируется. }
Рассмотрим пример программы, которая демонстрирует использование checked и unchecked.
static void Main()
{
byte x = 200; byte y = 200;
try
{
byte result = unchecked((byte)(x + y));
Console.WriteLine("1: {0}", result);
result = checked((byte)(x + y));
Console.WriteLine("2: ", result);
}
catch (OverflowException)
{
Console.WriteLine("возникло переполнение");
}
}Результат выполнения программы:
1: 144 возникло переполнение
В данном примере мы посмотрели, как использовать checked и uncheсked для проверки выражения. А теперь посмотрим, как использовать их для контроля за блоком инструкций.
static void Main()
{
byte n = 1; byte i;
try
{
unchecked //блок без проверки
{
for (i = 1; i < 10; i++) n *= i;
Console.WriteLine("1: {0}", n);
}
checked //блок с проверкой
{
n=1;
for (i = 1; i < 10; i++) n *= i;
Console.WriteLine("2: ", n);
}
}
catch (OverflowException)
{
Console.WriteLine("возникло переполнение");
}
}Результат выполнения программы:
1: 128 возникло переполнение
