Использование ключевых слов 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-02, просмотров: 233.