Основы языка C# 2005. Евсеева О.Н - 49 стр.

UptoLike

Составители: 

53
Вернемся к обсуждению нашего примера. Здесь как в проверяемых, так и
в непроверяемых блоках находятся охраняемые блоки с соответствующими
обработчиками исключительных ситуаций. Во всех случаях применяется
универсальный обработчик, захватывающий любое исключение в случае его
возникновения в try-блоке. Сами обработчики являются простыми
уведомителями, они лишь сообщают об ошибочной ситуации, не пытаясь
исправить ее.
Опасные вычисления в охраняемых проверяемых блоках
Такая ситуация возникает в первых двух try-блоках нашего примера. Эти
блоки встроены в проверяемый checked-блок. В каждом из них используются
опасные вычисления, приводящие к неверным результатам. Так, при
присваивании невинного выражения b+1 из-за переполнения переменная b
получает значение 0, а не 256. Поскольку вычисление находится в проверяемом
блоке, то ошибка обнаруживается и результатом является вызов исключения.
Далее, поскольку все это происходит в охраняемом блоке, то управление
перехватывается и обрабатывается в соответствующем catch-блоке. Эту
ситуацию следует отнести к нормальному, разумно построенному процессу
вычислений.
Опасные вычисления в охраняемых непроверяемых блоках
Такую ситуацию демонстрирует третий try-блок нашего примера,
встроенный в непроверяемый unchecked-блок. Здесь участвуют те же самые
опасные вычисления, но теперь их корректность не проверяется, они не
вызывают исключений, и как следствие, соответствующий catch-блок не
вызывается. Результаты вычислений при этом неверны, но никаких
уведомлений об этом нет. Это самая плохая ситуация, которая может случиться
при работе наших программ.
Отметим, что проверку переполнения в арифметических вычислениях
можно включить не только с помощью создания checked-блоков, но и путем
установки свойства checked проекта (по умолчанию, оно выключено). Как
правило, это свойство проекта всегда включается в процессе разработки и
отладки. В законченной версии проекта свойство вновь отключается, поскольку
полная проверка всех преобразований требует определенных накладных
расходов, увеличивая время работы; а проверяемые блоки остаются лишь там,
где такой контроль действительно необходим.
Область действия проверки или ее отключения можно распространить и
на отдельное выражение. В этом случае спецификаторы checked и unchecked
предшествуют выражению, заключенному в круглые скобки. Такое выражение
называется проверяемым (непроверяемым) выражением, а checked и unchecked
рассматриваются как операции, допустимые в выражениях.