|
Программирование >> Проектирование интерфейса пользователя
18-й час Обработка ошибок во время выполнения программы На прошлом занятии вы научились предотвращать, находить и устранять такие ошибки, которые принято называть термином bug, - в их появлении целиком повинен сам программист. Теперь мы рассмотрим приемы обработки ошибок другого рода. Важно понимать их существенные различия. Если в первом случае недостатки находятся в самом коде (из-за неверной реализации алгоритмов, неправильного использования объектов данных и т.д.), то во втором проблемы могут возникать, скажем, по причине ввода неправильных данных пользователем. (Да-да, пользователи - живые люди, и им свойственно совершать ошибки.) В иных ситуациях пользователь попытается открыть ранее удаленный файл, на диске может не хватить свободного места либо соединение с Internet окажется сброшенным . Подобные проблемы называют ошибками периода выполнения, и на этом занятии вы научитесь с ними справляться. Если в области программирования эта книга - ваш первый опыт, текущая глава определенно для вас. То же самое можно сказать и в случае, если программированием приходилось заниматься относительно давно - может быть, лет пять или шесть назад. С тех пор приемы борьбы с ошибками значительно изменились и получили существенное развитие. Вы узнаете, как писать устойчивый, живучий код, используя самые современные технологии обработки ошибок периода выполнения. Основные темы занятия. Исключительные ситуации. Создание программных обработчиков ошибок. Создание ресурсозащитных блоков. Использование объектов класса Err. Новый термин Сравнение технологий обработки ошибок Когда я был студентом колледжа, нас учили, что обработка ошибок в программе сопряжена с построением наборов управляющих структур для проверки фактов выполнения тех или иных условий. Главная идея заключалась в том, что программист, приступая к решению конкретной задачи, должен был построить ряд условных выражений, чтобы убедиться в правильности исходных данных и надлежащем состоянии кода. Такой подход нельзя назвать абсолютно неправильным и непродуктивным - просто он соответствовал прежнему состоянию развития технологий и уровню понимания проблем программирования. К тому времени уже появилась и другая технология обработки ошибок, связанная с отслеживанием так называемых исключительных ситуаций, но она еще не поддерживалась большинством основных языков и систем программирования. Исключительная ситуация, или исключение, - это условие, приводящее к возникновению ошибки, а обработчик исключений - программный код, позволяющий обнаружить ошибку и устранить ее последствия. С тех пор понятие надежности и устойчивости кода в сообществе программистов (и в индустрии программного обеспечения в целом) существенно изменилось. Теперь живучим называют код, в котором для борьбы с ошибками применяются обработчики исключений, а не условные конструкции. Это не значит, что код обработки исключений используется всеми и во всех возможных случаях, - просто данная технология более предпочтительна. Но прежде мы все-таки рассмотрим традиционные способы обработки ошибок, предусматривающие применение условных конструкций. Обработка ошибок с помощью условных выражений: старый подход Этот подход подразумевает предварительное включение в код целого набора условных конструкций для тестирования ситуаций, потенциально грозящих возникновением ошибок. На этапе проектирования и кодирования сложно учесть абсолютно все возможные условия - одни из них могут выпасть из рассмотрения случайно, другие на момент написания программы зачастую просто неизвестны. Еще один немаловажный фактор таков: программист, заранее предусматривающий различные нестандартные ситуации, склонен предполагать, что ошибки обязательно произойдут. Он насыщает код таким количеством проверок, что это не может не ухудшить производительности приложения - все дополнительные программные инструкции выполняются даже в том случае, когда в действительности все в порядке. Если какая-либо из ситуаций, приводящих к возникновению ошибки, оказывается неучтенной, программа просто (говоря молодежным сленгом) падает . Она либо прекращает реагировать на действия пользователя, либо приводит к зависанию или перезагрузке компьютера. Но шутки становятся неуместными, если авария программы сопровождается еще и потерей или повреждением данных. Программист в таком случае обычно не может знать обо всех истинных причинах ошибки, поэтому лучший способ ее исправления - размышления и поиски. Обработка исключений: современная технология Обработка исключений основывается на совершенно ином подходе. Идея, лежащая в его основе, заключается в написании кода, отлавливающего ошибки только в том случае, когда они действительно происходят. Обработчики исключительных ситуаций обеспечивают реакцию на все ошибки - без каких-либо исключений . Это означает, что не нужно тратить время на предварительный анализ потенциально опасных случаев и написание специализированных обработчиков - теперь ваш код способен справиться с любыми ошибками; достаточно сформулировать и зафиксировать те действия, которые программа должна выполнять в аварийных ситуациях по умолчанию. Обычное решение состоит в попытке вернуть программу в то состояние, в котором она пребывала непосредственно перед возникновением исключения. Хотя при этом не гарантируется устранение ошибки как таковой, подобная мера способна предотвратить зависание программы или сбой компьютера. Помимо мер, предусматривающих поведение программы по умолчанию, обработчики исключений не могут не учитывать возможности реагирования на ошибки конкретного типа и применения специальных действий. Если код не в состоянии полностью справиться с возникшей проблемой, вы как программист должны предложить пользователю сообщение с понятным описанием причин происшедшего и возможность корректного завершения работы, предотвращающую серьезные потери данных. Один из видов деятельности, которой занимается фирма Software Conceptions, состоит в тестировании и оценке программного обеспечения по заказам других компаний. Если процедуры тестируемого приложения возвращают коды ошибок и предусматривают их обработку с помощью наборов условных выражений, приложение получает заведомо низкую оценку. Если же в программе используется технология обработки исключений, ей - при прочих равных условиях - дается более высокая оценка. Код, в котором применяются обработчики исключительных ситуаций, наверняка более живучий . Многие факторы, составляющие понятие хорошей программы (и об этом уже говорилось), в достаточной степени субъективны. Никто не запрещает вам применять - и с успехом - способы обработки ошибок с помощью условных конструкций, но почти невероятно, что программа в этом случае будет так же надежна, как и при использовании технологии обработки исключительных ситуаций. Любой, кто предпочтет громоздким наборам условий компактные и универсальные обработчики исключений, окажется в более выгодном положении. Способность отлавливать все без исключения ошибки, возможность задания действий, предпринимаемых по умолчанию, средства устранения последствий ошибок либо корректного выхода из программы с сохранением данных, выполнение строк кода обработчика только в том случае, когда ошибка действительно произошла, - все эти факторы говорят о серьезном превосходстве методов обработки исключений над традиционными способами борьбы с ошибками на основе наборов условных конструкций. Компьютерное сообщество проголосовало, и новой технологии была присуждена победа (как в боксе) за явным преимуществом. Впрочем, вынужден вас огорчить - vBa все еще не обладает возможностями полноценной поддержки механизмов обработки исключительных ситуаций. Но есть и хорошая новость: в языке программирования Visual Basic (и, как следствие, в VBA) изначально реализована весьма неплохая схема отлова ошибок, которая, в некотором весьма напоминает классические способы обработки исключений. Visual Basic.NET поддерживает структурированную обработку исключений. В следующей части этой главы речь пойдет о самых эффективных приемах борьбы с ошибками, поддерживаемых в VBA. Приведенный ниже материал поможет вам в создании образцов надежного, устойчивого и живучего кода.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |