На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 7 / Обработка условий ошибок Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Обработка условий ошибок

Каждый программист, пытающийся написать надежное программное обеспечение, должен ожидать, что придется обрабатывать неизбежно появляющиеся ошибки. Спецификация расширенной памяти LIM 4.0 определяет 36 различных условий ошибок, которые может возвращать менеджер расширенной памяти, так же как и код, который сигнализирует об успешном завершении функции. Листинг 7-1 содержит определения для кодов ошибок спецификации расширенной памяти LIM 4.0, а в табл. 7-3 перечислены коды состояний ошибок.


Менеджер расширенной памяти возвращает детализированный код состояния завершения в регистре AH для каждого запроса на обслуживание при возврате из прерывания. По отношению к обнаружению и сообщению об ошибках интерфейс программирования спецификации расширенной памяти более последовательный и менее сложный, чем DOS. Для обнаружения и сообщения условия ошибки, последовавшего при вызове DOS, программист должен проанализировать регистр или флаг переноса и затем выдать другой системный вызов для возвращения детализированного кода ошибки.


                                                         Таблица 7-3
                  Коды состояний спецификации расширенной памяти
                             Lotus/Intel/Microsoft 4.0
         њњњњљњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњ
         Код ‹                         Описание
         њњњњќњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњ
         00H ‹Указанная функция завершилась без ошибок
         80H ‹Отказ программного обеспечения драйвера менеджера расширенной
             ‹памяти
         81H ‹Драйвер менеджера расширенной памяти  обнаружил  аппаратурный
             ‹отказ
         82H ‹Драйвер менеджера расширенной памяти занят (ничего другого не
             ‹произошло)
         83H ‹Hельзя отыскать указанного обработчика
         84H ‹Код функции неопределен
         85H ‹В настоящий момент нет доступных обработчиков
         86H ‹Произошла ошибка восстановления контекста отображения
         87H ‹Для запроса недостаточно общего числа страниц
         88H ‹Для запроса недостаточно числа неразмещенных страниц
         89H ‹Был запрос на нуль логических страниц из функции, совместимой
             ‹с LIM 3.2
         8AH ‹Логическая страница вне диапазона указанного обработчика
         8BH ‹Физическая страница вне диапазона
         8CH ‹Переполнение области сохранения контекста регистров отображе-
             ‹ния
         8DH ‹У стека контекста регистров отображения  уже  есть  контекст,
             ‹связанный с указанным обработчиком
         8EH ‹У стека контекста регистров отображения нет контекста, связан-
             ‹ного с указанным обработчиком
         8FH ‹Была запрошена неопределенная подфункция
         90H ‹Тип атрибута не определен
         91H ‹Система не поддерживает неразрушаемость (энергонезависимость)
         92H ‹При  передвижении  области произошла частичная перезапись ис-
             ‹точника
         93H ‹Область  расширенной памяти слишком велика для указанного об-
             ‹работчика
         94H ‹Области обычной и расширенной памяти перекрываются
         95H ‹Смещение в пределах логической страницы превосходит длину ло-
             ‹гической страницы
         96H ‹Длина области превышает предел в 1 Мбайт
         97H ‹Области расширенной памяти источника и приемника имеют один и
             ‹тот же обработчик и перекрываются
         98H ‹Hеопределенные/неподдерживаемые  типы памяти источника и при-
             ‹емника
         9AH ‹Указанный  альтернативный  набор регистров отображения не су-
             ‹ществует
         9BH ‹Все альтернативные наборы регистров  отображения/ПДП исполь-
             ‹зуются
         9CH ‹Hе поддерживаются альтернативные наборы регистров отображения
             ‹/ПДП
         9DH ‹Указанный  альтернативный  набор регистров отображения/ПДП не
             ‹определен, не размещен или является текущим
         9EH ‹Закрепленные каналы ПДП не поддерживаются
         9FH ‹Указанный закрепленный канал ПДП не существует
         A0H ‹Hе  может быть найдено значение обработчика, соответствующее
             ‹указанному имени обработчика
         A1H ‹Обработчик с указанным именем уже существует
         A2H ‹Попытка перехода к началу 1-Мбайтного  адресного пространства
             ‹во время передвижения или обмена
         A3H ‹Содержимое  структуры  данных  пользователя,  переданное  для
             ‹функции искажено или бессмысленно
         A4H ‹Операционная система не допускает обращения к функции
         њњњњ™њњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњ

                               Листинг 7-1.EMMERR.H
         ------------------------------------------------------------------

         /*

         Продукт:       Диск над;
         Версия:        2.00
         Наименование:  emmerr.h
         Содержание: определения кодов ошибок спецификации расширенной па-
                        мяти LIM 4.0
         Ссылка: спецификация расширенной памяти LIM версия 4.0 стр.А5-А10
         */

        #defineFRSTEMERR  0x80  /*номер первой ошибки менеджера расширенной
                                                           памяти*/
        #defineLASTEMERR  0xA4  /*номер последней ошибки менеджера расши-
                                                          ренной памяти*/

        #defineFUNCCOC    0x00  /*указанн. функция завершилась без ошибок*/
        #defineEMDRVSWF   0x80  /*отказ  программного  обеспечения драйвера
                                             менеджера расширенной памяти*/
        #defineEMDRVHWF   0x81  /*драйвер менеджера расширенной памяти
                                             обнаружил аппаратурный отказ*/
        #defineEMDRVBSY   0x82  /*драйвер менеджера расширенной памяти
                                      занят (ничего другого не произошло)*/
        #defineHANDLNFD   0x83  /*нельзя отыскать указанного обработчика */
        #defineFUNCCUND   0x84  /*код функции неопределен */
        #defineHANDLINS   0x85  /*в настоящий момент нет доступных обра-
                                                                ботчиков*/
        #defineMAPCXPRO   0x86  /*произошла ошибка восстановления контекста
                                                              отображения*/
        #defineTOTPGINS   0x87  /*для запроса   недостаточно   общего
                                                           числа  страниц*/
        #defineUNAPGINS   0x88  /*для  запроса недостаточно числа
                                                    неразмещенных страниц*/
        #defineLPAGE2SM   0x89  /*был запрос на нуль логических страниц из
                                          функции,  совместимой с LIM 3.2*/
        #defineLPAGERNG   0x8A  /*логическая страница вне диапазона ука-
                                                      занного обработчика*/
        #definePPAGE2BG   0x8B  /*физическая страница вне диапазона*/
        #defineMRCSAFUL   0x8C  /*переполнение области сохранения контекста
                                                   регистров  отображения*/
        #defineMRCSTDUP   0x8D  /*у  стека  контекста регистров отображения
                                уже есть контекст, связанный  с  указанным
                                                             обработчиком*/
        #defineMRCSTNFD   0x8E  /*у стека контекста регистров отображения
                                нет контекста, связанного с указанным об-
                                                               работчиком*/
        #defineSFUNCUND   0x8F  /*была запрошена неопределенн. подфункция*/
        #defineATTRBUND   0x90  /*тип атрибута не определен*/
        #defineNVSTGUNS   0x91  /*система  не поддерживает неразрушаемость
                                                    (энергонезависимость)*/
        #defineMREGNOVW   0x92  /*при передвижении области произошла
                                           частичная перезапись источника*/
        #defineMREGN2SM   0x93  /*область расширенной памяти слишком велика
                                  для указанного обработчика*/
        #defineMREGNOVL   0x94  /*области обычной и расширенной памяти пе-
                                                           рекрываются*/
        #defineLPGOF2BG   0x95  /*смещение  в пределах логической страницы
                                 превосходит длину логической страницы*/
        #defineMREGN2BG   0x96  /*длина области превышает предел в 1Мбайт*/
        #defineMREGNDUP   0x97  /*области расширенной памяти источника и
                                приемника имеют один и тот же обработчик и
                                                            перекрываются*/
        #defineMREGNUND   0x98  /*неопределенные/неподдерживаемые  типы
                                             памяти источника и приемника*/
        #defineAMRSNFD    0x9A  /*указанный альтернативный набор регистров
                                                отображения не существует*/
        #defineAMDRSINS   0x9B  /*все альтернативные наборы регистров отоб-
                                                 ражения/ПДП используются*/
        #defineAMDRSUNS   0x9C  /*не поддерживаются альтернативные наборы
                                                регистров отображения/ПДП*/
        #defineAMDRSUND   0x9D  /*указанный альтернативный набор регистров
                                отображения/ПДП не определен,  не размещен
                                                     или является текущим*/
        #defineDDMACUNS   0x9E  /*закрепленные каналы ПДП не поддерж-ся*/
        #defineDDMACNFD   0x9F  /*указанный закрепленный канал ПДП не су-
                                                                 ществует*/
        #defineHNDVLNFD   0xA0  /*не может быть найдено значение обработчи-
                                ка, соответствующее  указанному  имени об-
                                                                работчика*/
        #defineHNDNMDUP   0xA1  /*обработчик с указанным именем уже сущест-
                                                                     вует*/
        #defineMREGNWRP   0xA2  /*попытка перехода к началу 1-Мбайтного
                                адресного пространства во время передвиже-
                                                           ния или обмена*/
        #defineUSRDSFMT   0xA3  /*содержимое структуры данных пользователя,
                                переданное для функции  искажено  или бес-
                                                                смысленно*/
        #defineOPSYSACC   0xA4  /*операционная система не допускает обраще-
                                                            ния к функции*/
         -------------------------------------------------------------------

Поскольку проверка на наличие ошибок, обнаруженных монитором расширенной памяти - просто вопрос тестирования регистра AH на нуль после каждого вызова, всегда оказывается разочаровывающим наталкивание на популярное коммерческое программное обеспечение, которое не удосуживается проделать это. Избавьте себя (и Ваших пользователей) от забот отлавливания загадочных зависаний и отказов посредством проверки кода ошибки после каждого вызова менеджера расширенной памяти.


Реакция программы на условие ошибки, возвращенное менеджером расширенной памяти, зависит от природы ошибки и от возможности программы приспособиться к условиям, на которые спецификация расширенной памяти LIM ссылается как на "невосстанавливаемые". Например, программа может сделать очень немногое, получив от менеджера расширенной памяти индикацию "Отказ аппаратуры расширенной памяти", помимо сообщения о проблеме пользователю и воздержания от дополнительного использования обслуживанием менеджера расширенной памяти.


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


Другие условия такие, как "Физическая страница вне диапазона", обычно показывают, что имеет место ошибка проектирования или программирования в приложении спецификации расширенной памяти. Реализуйте Ваши программы обработки ошибок спецификации расширенной памяти так, чтобы они сообщали ячейку в Вашей программе, где появилось условие ошибки, предпочтительно таким образом, который связан с исходным кодом.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz