Использование ключевых слов 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");

// далее основная часть программы

. . .

}

}

 




Дата добавления: 2019-02-08; просмотров: 967;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.014 сек.