ЗАМЕЧАНИЕ

Исключения

ЗАМЕЧАНИЕ

Преобразование из типов int, uint и long в тип float и из типа long в тип double может вызвать потерю точности, но не потерю значимости. В процессе других вари­антов неявного преобразования никакая информация не теряется.

При вычислении выражений могут возникнуть ошибки, например, переполне­ние, исчезновение порядка или деление на ноль. В С# есть механизм, который позволяет обрабатывать подобные ошибки и таким образом избегать аварийного завершения программы. Он так и называется: механизм обработки исключитель­ных ситуаций (исключений).

Если в процессе вычислений возникла ошибка, система сигнализирует об этом с помощью специального действия, называемого выбрасыванием (генерированием) исключения. Каждому типу ошибки соответствует свое исключение. Поскольку С# — язык объектно-ориентированный, исключения являются классами, которые имеют общего предка — класс Exception, определенный в пространстве имен System.

Например, при делении на ноль будет выброшено (сгенерировано) исключение с длинным, но понятным именем DivideByZeroException, при недостатке памяти — ис­ключение OutOfMemoryException, при переполнении — исключение OverflowException.

Стандартных исключений очень много, тем не менее программист может создавать и собственные исключения на основе класса Exception.

 

Программист может задать способ обработки исключения в специальном блоке ко­да, начинающемся с ключевого слова catch («перехватить»), который будет автома­тически выполнен при возникновении соответствующей исключительной ситуации. Внутри блока можно, например, вывести предупреждающее сообщение или скорректировать значения величин и продолжить выполнение программы. Если этот блок не задан, система выполнит действия по умолчанию, которые обычно заключа­ются в выводе диагностического сообщения и нормальном завершении программы.

Процессом выбрасывания исключений, возникающих при переполнении, можно управлять. Для этого служат ключевые слова checked и unchecked. Слово checked включает проверку переполнения, слово unchecked выключает. При выключенной проверке исключения, связанные с переполнением, не генерируются, а результат операции усекается. Проверку переполнения можно реализовать для отдельного выражения или для целого блока операторов, например:

 

а=checked (b+с); // для выражения

 

unchecked { // для блока операторов

а = b + с;

}

 

Проверка не распространяется на функции, вызванные в блоке. Если проверка переполнения включена, говорят, что вычисления выполняются в проверяемом контексте, если выключена — в непроверяемом. Проверку переполнения вы­ключают в случаях, когда усечение результата операции необходимо в соответ­ствии с алгоритмом.

Можно задать проверку переполнения во всей программе с помощью ключа ком­пилятора /checked, это полезно при отладке программы. Поскольку подобная проверка несколько замедляет работу, в готовой программе этот режим обычно не используется.

 

Основные операции С#