|
Программирование >> Дополнительные возможности наследования
Все компиляторы позволяют компилировать программы с использованием символов или без них, Компилирование с символами указывает компилятору на необходимость установки взаимосвязей между исходным кодом файлов источников и сгенерированной программой, благодаря чему отладчик может указать на строку исходного кода, которая соответствует следующему действию в вашей программе. Полноэкранные символьные отладчики превосходно справляются с этой сложной работой, После загрузки отладчик считывает весь исходный код программы и отображает его в окне, Отладчик позволяет проходить в пошаговом режиме через все строки программы в порядке их выполнения. При работе с большинством отладчиков можно переключаться между исходным кодом и выводом на экран, чтобы видеть результаты выполнения каждой команды. Полезной таюке является возм< кность определения текущего значения любой переменной, в том числе переменных-членов классов и значений в ячейках области динамического обмена, на которые ссылаются указатели программы, а также просмотр сложных структур данных, Отладчики предоставляют ряд утилит, позволяющих устанавливать в коде программы точки останова, выводить контрольные значения переменных, исследовать особенности распределения памяти и просматривать код ассемблера. Точки останова Точки останова - зто команды, предназначенные для отладчика и означающие, что программа должна остановиться перед выполнением указанной строки. Это средство позволяет экономить время при отладке, выполняя программу в обычном режиме до того места, где установлена точка останова. После остановки вьшолнения программы мохсно проанализировать текущие значения переменных или продолжить работу программы в пошаговом режиме. Анализ значвниО пврвмвнных Можно указать отладчику на отображение значения конкретной переменной или на останов программы, когда заданная переменная будет читаться или записываться. Отладчик даже позволяет изменить значение переменной в процессе вьшолнения программы. Исслвдоаанив аамяти Время от времени важно просматривать реальные значения, содержащиеся в памяти, Современные отладчики могут отображать эти значения в понятном для пользователя виде, т.е. строки отображаются как символы, а числовые значения - как десятичные цифры, а не в двоичном коде. Современные отладчики С++ могут даже показывать целые классы с текущими значениями всех переменных-членов, включая указатель this. Хотя чтения исходного кода иногда бывает достаточно для обнаружения ошибки, тем не менее можно указать отладчику на отображение реального кода ассемблера, сгенерированного для каждой строки исходного кода. Вы можете просмотреть значения регистраторов памяти и флагов и при желании настолько углубиться в дебри машинного кода, насколько нужно. Научитесь пользоваться своим отладчиком. Это может оказаться самым мощным оружием в ващей священной войне с ошибками. Ошибки выполнения программы считаются наиболее трудными для поиска и устранения, и мошный отладчик в состоянии помочь вам в этом. Резюме Сегодня вы узнали, как создавать и использовать исключения, т.е. объекты, которые могут быть созданы в тех местах программы, где исполняемый код не может обработать ошибку или другую исключительную ситуацию, возникшую во время выполнения программы. Другие части программы, расположенные выше в стеке вызовов, выполняют блоки catch, которые перехватывают исключение и отвечают на возникшую исключительную ситуацию соответствующим образом. Исключения - это нормальные созданные пользователем объекты, которые можно передавать в функции как значения или как ссылки. Они могут содержать данные и методы, а блок catch может использовать эти данные, чтобы определить, как справиться с возникшими проблемами. Можно создать конструкции из нескольких блоков catch, но следует учитывать, что, как только исключение будет перехвачено отдельным оператором catch, оно не будет передаваться последующим блокам catch. Очень важно правильно упорядочить блоки catch, чтобы специфические блоки стояли выше более общих блоков. На этом занятии также рассматривались некоторые основные принципы работы символьных отладчиков, включая использование таких средств, как точки останова, анализ значений переменных и т.д. Эти средства позволяют выполнить останов программы в той части, которая вызывает появление ошибки, и просмотреть значения переменных в ходе программы. Вопросы о ответы Зачем тратить время на программирование исключений? Не лучше ли устранять ошибки по мере их возникновения? Часто одна и та же ошибка может возникать при выполнении разных функций программы. Использование исключений позволяет собрать коды отслеживания ошибок в одном месте программы. Кроме того, далеко не всегда возможно вписать код устранения ошибки в том месте программы, где эта ошибка возникает. Зачем создавать исключения как объекты? Не проще ли записать код устранения ошибки? Объекты более гибки и универсальны в использовании, чем обычные программные блоки. С объектами можно передать больше информации и снабдить конструктор и деструктор класса исключения функциями устранения возникшей ошибки. Почему бы не использовать исключения не только дня отслеживания исключительных ситуаций, но и для выполнения рутинных процессов? Разве не удобно использовать исключения дня быстрого и безопасного возвращения но стеку вызовов к исходному состоянию программы? Безусловно, и многие программисты на С++ используют исключения именно в этих целях. Но следует помнить, что прохождение исключения по стеку вызовов может оказаться не таким уж безопасным. Так, если объект был создан в области динамического обмена, а потом удален в стеке вызовов, это может привести к утечке памяти. Впрочем, при тщательном анализе программы и использовании современного компилятора эту проблему можно предупредить. Кроме того, многие профаммисты считают, что использование исключений не по прямому назначению делает профамму слишком запутанной и нелогичной. Всегда ли следует перехватывать исключения сразу за блоком try, генерирующим это исключение? Нет, в стеке вызовов перехват исключения может осуществляться в любом месте, после чего стек вызовов будет пройден то того места, где происходит обработка исключения. Зачем использовать утилиту отладки, если те же функции можно осуществлять прямо во время компиляции с помощью объекта cout и условного выражения flifdef debug? В действительности утилита отладки предоставляет значительно больше средств и возможностей, таких как пошаговое выполнение профаммы, установка точек останова и анализ текущих значений переменных. При этом вам не приходится перефужать свой код многочисленными командами препроцессора и выражениями, которые никак не связаны с основным назначением программы. Коллоквиум в этом разделе предлагаются вопросы для самоконтроля и укрепления полученных знаний, а также ряд упражнений, которые помогут закрепить ваши практические навыки. Попытайтесь самостоятельно ответить на вопросы теста и выполнить задания, а потом сверьте полученные результаты с ответами в приложении Г. Не приступайте к изучению материала следующей главы, если для вас остались неясными хотя бы некоторые из предложенных ниже вопросов. 1. Что такое исключение? 2. Для чего нужен блок try? 3. Для чего используется оператор catch? 4. Какую информацию может содержать исключение? 5. Когда создается объект исключения? 6. Следует ли передавать исключения как значения или как ссылки? 7. Будет ли оператор catch перехватывать производные исключения, если он наСфоен на базовый класс исключения? 8. Если используются два оператора catch, один из которых настроен на базовое сообшение, а второй - на производное, то в каком порядке их следует расположить? 9. Что означает оператор catch(...)? 10. Что такое точка останова? Упражнения 1. Запишите блок try и оператор catch для отслеживания и обработки простого исключения. 2. Добавьте в исключение, полученное в упражнении 1, переменную-член и метод доступа и используйте их в блоке оператора catch. 999984�7
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |