Главная » C# » Предотвращение раскрутки стека в Visual C# (Sharp)

0

Обработка исключений позволяет предотвратить сбой программы, но не помогает удостовериться в том,  что состояние приложения не было изменено.  Рассмотрим пример (рис. 5.5), иллюстрирующий, как состояние программы может быть искено перехваченным, но необработанным исключением.

Рис. 5.5. Исключения могут исказить состояние программы

При перехвате исключения выполняется раскрутка стека. На рис. 5.6 показан прер побочного эффекта раскрутки стека — перепрыгивание через вызов метода.

В примере, показанном на рис. 5.6, методы вызываются последовательно. Первым вызывается метод RunAiio, а после выбрасывания исключения немедленно выпояется блок catch метода RunAii (). Поэтому по завершении исполнения, значение переменной depth будет 2 вместо ожидаемого 0, каким бы оно было, если бы не бо сгенерировано  исключение. Можно видеть, что раскрутка стека была выполнена слишком быстро, вызвав непредсказуемые результаты выполнения программы.

Таким образом, проблема преждевременной раскрутки  стека вызывает искажение состояния программы, порой катастрофическое. Кажущаяся рабочей программа может исказить саму себя и медленно перейти в нерабочее состояние или начать выдавать неправильные результаты. К счастью, существует пара способов для претвращения слишком быстрой раскрутки стека.

Рис. 5.6. Раскрутка стека может вызвать пропуск вызова метода

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии