Интернет магазин музыки, mp3 почтой, заказать mp3 диски

баннер интернет-магазина ножей nifovka.ru

RSS - RSS,
Карта сайта

Rambler's Top100

Написать на e-mail © 2007-2012 г.



Теги страницы:

Весь код, который я должен вам объяснить, находится в ErrorHandling.h и EnorHan.dlmg.cpp source файлах, если вы хотите следовать дальше. Объект СЕггог. Все начинается с объекта СЕггог. Большую часть времени, когда программисты используют исключительные ситуации, они не используют в throw примитивные типы данных вроде string или integer. Наоборот, они используют классы которые содержат не только но и некоторую диагностическую информацию и описание ситуации, почему и когда возникает эта ошибка. Аудио движок, описывае¬мый в этой книге, сохраняет эту информацию в СЕггог, как показано здесь. CError - это очень простой класс. Он содержит ряд из названия source файла, где возникла ошибка (in File), номер строчки внутри этого файла (ni_Linc). неправильную строку, показываемую пользователю^Error) и внутреннее диагностическое сообщение (m_Reason). Есть средства доступа к любому из его членов, конструкция shortcut, которая автоматически вызывает DXGet ErrorS Јrin^8. если это и элемент GetMessageBoxString, который собирает переменные в сообщение, показываемое пользователю.

Define в обработке ошибок. Я написал немного Define кода, чтобы обращение с С Errors стало легче. Я основывал define код, шторый вы увидите, на замечательной статье Стива Рабнна, называющейся «Squeezing More Out of Assert», которая была напечатана в Game Program¬ming Gems 1 (ISBN 1-58450-049-2), замечательной книге, которую я рекомендую для любого серьезного игрового программиста (и не только потому, что я написал для нее парочку статей) Внутри ErrorJ-laiidlifig.h есть два определения, называющиеся Throw)[Failed и Throw (обратите внимание на заглавную букву, чтобы не спутать со словом throw). Сначала я объясню Throw, потому что это проще. Throw - это просто сокращение для вызова глобальной функции Вот как CError получает переменные m File и m Line: да define автоматически под¬держивает текущие название файла номер строки, благодаря встроенным макросам _ FILE _ и _ LINE _ .

Функция ThrowCError отвечает за создание объекта CError. ThrowCError должен показать сообщение с кнопками Abort, Retry и Ignore. Если пользователь выбирает Abort, функция немедленно выходит. Если он выбирает Ignore, код немедленно использует к ошибке throw, как будто это сообщение никогда не появлялось. Если он выбирает Retry, функция возвращает false. Посмотрите назад на define в Throw: если ThrowCError возвращает false, то мы осуществляем (в компоновке) инструкцию int 3. Инструкция int 3 производит отла¬дочное прерывание, которое, когда программа управляется программой отладки, тут же вызывает остановку выполнения. Тогда почему бы ни вставить int 3 прямо в ThrowCError? Если бы она была частью функции ThrowCError, вам нужно было бы двигать стек на одну ячейку, чтобы посмотреть, что же на самом деле произошло. Если int 3 является частью define, когда вы выходите, вы попадаете непосредственно к источнику ошибки. Этот ловкий трюк, за который я обязан отдать должное Стиву Рабину. Теперь, когда вы как работает Throw, ознакомьтесь с более сложной функцией.

Define делает то же самое, что и Throw, но только если Н RESl 11, который вы ему передали, является неправильным кодом. Если FAJLED( result) возвращает true, код передает HRESULT функции ThrowC'Error. которая, в свою очередь, передает его С Error конструктору. Конструктор ищет код и соответствующую ему ошибочную строку в m_Reason. Эти два define часто оказываются полезными, поэтому вы увидите их довольно часто во всем коде звукового движка. Эта маленькая система обработки ошибок придаст вашей программе надежности. Конечно, вы всегда можете в нее добавить много но я обнаружил, что даже эта простая схема действительно помогает, когда что-то идет не так.