Укажите типы ошибок в программе

Один модуль может передавать данные другому или даже другой про грамме. Некоторые данные могут передаваться между модулями множество раз, и на каком-то этапе они могут быть разрушены или неверно интерпретированы. Изменения, внесенные одной из частей программы, могут потеряться или достичь не всех частей системы, где они важны.

• Неправильная интерпретация данных. Программа передает подпрограмме значение температуры по шкале Цельсия, а та интерпретирует его как температуру по Фаренгейту.

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

• Затирание кода другого процесса. Может произойти, если два процесса имеют доступ к одной и той же области памяти.

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

Разбор 6 задания | ОГЭ по информатике 2023

Ситуация гонок

Классическая ​ситуация гонок описывается так. Предположим, в систе​ме ожидаются два события, А и Б. Первым может произойти любое из них. Но если первым произойдет событие А, выполнение программы продолжится, а если первым наступит событие Б, то в работе программы произойдет сбой.

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

• Гонки при обновлении данных. Клиент банка получил $500 и потратил $100, до этого на его счете было $1000. Первая процедура считала с диска остаток в $1000 и вычла из него $100. До того, как она записала результат на диск, вторая процедура счи​тала остаток и добавила к нему $500. Затем первая процедура записала свой результат, а вторая — свой.

В результате вместо $1400 остаток получился равным $1500.

• Предположение, что одно задание завершится до начала другого.

• Сообщения приходят одновременно или не в том порядке, в котором они были отправлены.

Перегрузки

Программа может не справляться с повышенными нагрузками. Напри​мер, она может не выдерживать интенсивной и длительной эксплуатации или не справляться со слишком большими объемами данных. Кроме того, сбои могут происходить из-за нехватки памяти или отсутствия других не​обходимых ресурсов. У каждой программы свои пределы. Вопрос в том, соответствуют ли реальные возможности и требования программы к ресур​сам ее спецификации и как программа себя поведет при перегрузках.

• Требуемый ресурс недоступен (диск полон, стек полон, очередь печати заполнена, в принтере нет ленты, . )

• Потеря информации о нажатых клавишах изза недостаточного размера буфера ввода или очереди.

Поиск ошибок в программе

Аппаратное обеспечение

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

• Неверный адрес устройства.

• Данной программе или устройству доступ к устройству запрещен.

Контроль версий

Бывает, что старые ошибки вдруг всплывают снова из-за того, что про​грамма скомпонована с устаревшей версией одной из подпрограмм. Поэтому версии всех составляющих проекта обязательно должны централизованно контролироваться. Кроме того, следует убедиться, что правильны все появляющиеся на экране сообщения об авторских правах, названии и номере версии программного продукта. Обязательной проверке подлежат десятки мелких деталей. Обычно контроль программы и ее исходного кода осуществляется группой контроля качества.

• В программе появляются старые ошибки, ранее исправлявшиеся (программист скомпоновал старую версию одной программы с новыми версиями остальных).

• Ошибка, исправленная в одном месте программы может быть обнаружена в другом (Программист использовал один и тот же код в разных программных модулях.Изменив его в одном месте, программист мог забыть изменить его в остальных местах (копиях этого кода)).

• Неверный номер версии программы в заголовке экрана.

• Неверная информация об авторских правах.

Документация

Документация считается частью программного продукта. И если она плохо написана, пользователь может подумать, что и сама программа работает некорректно.

Ошибки тестирования

Если программист допускает по полторы ошибки на каждую строку программного кода, то сколько их допускает тестировщик на каждый тест? Обнаружение ошибок, допущенных тестировщиками, — дело обычное. Конечно, если таких ошибок будет слишком много, вы быстро потеряете доверие остальных членов команды. Но нужно иметь в виду, что иногда ошибки тестировщика отражают проблемы пользовательского интерфейса: если программа заставляет пользователя делать ошибки, значит, с ней что- то не так. Конечно, многие ошибки тестирования вызваны просто невер​ными тестовыми данными.

• Пропущены ошибки в программе. После обнаружения пропущенной ошибки нужно усовершенствовать процедуру тестирования.

• Не документирована проблема (тестировщика просили больше не документировать подобные проблемы).

• Не выполнен запланированный тест (тестовые материалы и записи плохо организованы, тесты перепутаны).

• Проигнорированы предложения программистов — программист знает, какие функции кодировались слишком быстро, какие тесты выявили больше важных ошибок и где в программе могут встречаться подобные ошибки.

• Документирование ошибки, которой нет на самом деле. Может оказаться, что проблема связана с неправильными действиями тестировщика, его непониманием программы: “После залогинивания в системе в браузере IE, в браузере FireFoxавторизационные данные не вводятся автоматически”.

• Ошибка выявлена и забыта. После документирования ошибки нужно отслеживать ее исправление.

Терминология

Ниже в таблице будет указана терминология, использующаяся в материале урока.

Название термина Описание
ПО Программное обеспечение, программа
Программа Программный продукт, разрабатываемый программистами и тестируемый тестировщиками
Пользователь Конечный потребитель программного продукта
Отладка Процесс исправления ошибок в коде
Ошибка, дефект, баг, BUG Изъян в программе, который вызывает несоответствие ожидаемых результатов выполнения программы и фактически полученных результатов
Сбой Внезапная остановка работающей программы
Проектирование Деятельность по созданию. Проектирование системы: выстраивание архитектуры системы. Проектирование тестов: Создание тестовой документации,тест-кейсов.
Спецификация Документ, описывающий требования к разработке той или иной части программного продукта, описание функционала, дизайна, назначения и целей. Описание того, как должно работать ПО.
ТЗ Техническое задание, исходный документ для разработки и испытания ПО. Как правило, ТЗ для ИТ-проектов пишется в соответствии со стандартами ГОСТ 19, ГОСТ 34.
Читайте также:
Как установить на телефон программу парковки

Практика

Домашнее задание

Необходимо описать шаги для всестороннего тестирования какого-нибудь предмета (напр., кубик Рубика, кот, будильник). Для подсказки можно пользоваться описаниями типов ошибок в методичке к этому уроку.

Итак, возьмем кубик Рубика. Что мы можем проверить в нем?

• Внешний вид: Цвет уникальный на каждой стороне? Форма квадратная? Какой размер?

• Состояние: новый или б/у?

• Пригоден для использования? Все стороны крутятся?

• Удобно держать в руке?

• Разваливается при использовании?

• Острые углы имеются? Можно ли пораниться об него?

• Есть ли неприятный запах?

• Уронить на пол: Прочный ли? Сломался?

• Можно ли физически разобрать на детальки и собрать снова?

Протестировать страницу авторизации в электронной почте. Для этого, предварительно нужно создать тестовый аккаунт (можно использовать свой). Далее, опираясь на описание категорий ошибок в методичке, выписать в таблицу действия, которые можно совершить пытаясь войти в почту. Цель — придумать проверки, понимать какой ждем результат проверки.

Действие Результат
1
2
.

В приложенной картинке найти 3 ошибки.

*Найти и описать ошибки на предложенной форме. При выполнении задания руководствоваться описанием ошибок пользовательского интерфейса.

В заголовке письма указать следующее : Задание 1 – Фамилия Имя – ник (если есть)

Дата добавления: 2018-08-06 ; просмотров: 1586 ; Мы поможем в написании вашей работы!

Поделиться с друзьями:

Источник: studopedia.net

Обработка ошибок

Аннотация: Попытка классификации ошибок. Сообщение об ошибке с помощью возвращаемого значения. Исключительные ситуации. Обработка исключительных ситуаций, операторы try и catch.

Виды ошибок

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

Ошибки компиляции пропустим:пока все они не исправлены, программа не готова, и запустить ее нельзя. Здесь мы будем рассматривать только ошибки , происходящие во время выполнения программы.

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

Теоретически возможно написать программу без таких ошибок . Во многом язык Си++ помогает предотвратить ошибки во время выполнения программы,осуществляя строгий контроль на стадии компиляции. Вообще, чем строже контроль на стадии компиляции, тем меньше ошибок остается при выполнении программы.

Перечислим некоторые средства языка, которые помогут избежать ошибок :

  1. Контроль типов . Случаи использования недопустимых операций и смешения несовместимых типов будут обнаружены компилятором.
  2. Обязательное объявление имен до их использования. Невозможно вызвать функцию с неверным числом аргументов. При изменении определения переменной или функции легко обнаружить все места, где она используется.
  3. Ограничение видимости имен, контексты имен. Уменьшается возможность конфликтов имен, неправильного переопределения имен.

Самым важным средством уменьшения вероятности ошибок является объектно-ориентированный подход к программированию, который поддерживает язык Си++. Наряду с преимуществами объектного программирования, о которых мы говорили ранее, построение программы из классов позволяет отлаживать классы по отдельности и строить программы из надежных составных «кирпичиков», используя одни и те же классы многократно.

Несмотря на все эти положительные качества языка, остается «простор» для написания ошибочных программ. По мере рассмотрения свойств языка, мы стараемся давать рекомендации, какие возможности использовать, чтобы уменьшить вероятность ошибки .

Лучше исходить из того, что идеальных программ не существует, это помогает разрабатывать более надежные программы. Самое главное – обеспечить контроль данных, а для этого необходимо проверять в программе все, что может содержать ошибку . Если в программе предполагается какое-то условие, желательно проверить его, хотя бы в начальной версии программы, до того, как можно будет на опыте убедиться, что это условие действительно выполняется. Важно также проверять указатели, передаваемые в качестве аргументов, на равенство нулю; проверять, не выходят ли индексы за границы массива и т.п.

Ну и решающими качествами, позволяющими уменьшить количество ошибок , являются внимательность, аккуратность и опыт .

Второй вид ошибок – «предусмотренные», запланированные ошибки . Если разрабатывается программа диалога с пользователем, такая программа обязана адекватно реагировать и обрабатывать неправильные нажатия клавиш. Программа чтения текста должна учитывать возможные синтаксические ошибки . Программа передачи данных по телефонной линии должна обрабатывать помехи и возможные сбои при передаче. Такие ошибки – это, вообще говоря, не ошибки с точки зрения программы, а плановые ситуации, которые она обрабатывает.

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

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

Возвращаемое значение как признак ошибки

Простейший способ сообщения об ошибках предполагает использование возвращаемого значения функции или метода. Функция сохранения объекта в базе данных может возвращать логическое значение : true в случае успешного сохранения, false – в случае ошибки .

class Database < public: bool SaveObject(const Object >;

Соответственно, вызов метода должен выглядеть так:

if (database.SaveObject(my_obj) == false )< //обработка ошибки >

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

int main() < if (fun1()==false ) //обработка ошибки return 1; >bool fun1() < if (fun2()==false ) return false ; return true ; >bool fun2()

Если функция или метод должны возвращать какую-то величину в качестве результата, то особое, недопустимое, значение этой величины используется в качестве признака ошибки . Если метод возвращает указатель , выдача нулевого указателя применяется в качестве признака ошибки . Если функция вычисляет положительное число, возврат — 1 можно использовать в качестве признака ошибки .

Иногда невозможно вернуть признак ошибки в качестве возвращаемого значения . Примером является конструктор объекта, который не может вернуть значение . Как же сообщить о том, что во время инициализации объекта что-то было не так?

Распространенным решением является дополнительный атрибут объекта – флаг, отражающий состояние объекта. Предположим, конструктор класса Database должен соединиться с сервером базы данных .

Читайте также:
Программа как у тони старка

class Database < public : Database(const char *serverName); . bool Ok(void) const ; private : bool okFlag; >; Database::Database(const char*serverName) < if (connect(serverName)==true ) okFlag =true ; else okFlag =false ; >int main() < Database database(«db-server»); if (!database.Ok())< cerr return 1; >

Лучше вместо метода Ok , возвращающего значение флага okFlag , переопределить операцию ! ( отрицание ).

class Database < public : bool operator !()const ; >;

Тогда проверка успешности соединения с базой данных будет выглядеть так:

if (!database)

Следует отметить, что лучше избегать такого построения классов, при котором возможны ошибки в конструкторе . Из конструктора можно выделить соединение с сервером базы данных в отдельный метод Open:

class Database

и тогда отпадает необходимость в операции ! или методе Ok() .

Использование возвращаемого значения в качестве признака ошибки – метод почти универсальный. Он применяется, прежде всего, для обработки запланированных ошибочных ситуаций. Этот метод имеет ряд недостатков. Во-первых, приходится передавать признак ошибки через вложенные вызовы функций. Во-вторых, возникают неудобства, если метод или функция уже возвращают значение , и приходится либо модифицировать интерфейс , либо придумывать специальное » ошибочное » значение . В-третьих, логика программы оказывается запутанной из-за сплошных условных операторов if с проверкой на ошибочное значение .

Источник: intuit.ru

Классификация ошибок.

Ошибки делятся на шесть основных категорий (перечислены по степени сложности):

Ошибки формата файла

В операционных системах Unix, Windows для завершения строки используются разные символы.

Это может вызвать проблемы, если вы редактируете свою программу в операционной системе одного типа, а затем запускаете ее в другой ОС. Иными словами, если вы создаете и (или) редактируете свои программы на Windows, а ваш Internet-провайдер использует Web-сервер на базе Unix, необходимо удостовериться, что файл вашей программы сохранялся с соответствующими разделителями строк.

Один из простых способов сделать это — открыть файл на своем Web-сервере и посмотреть, есть ли в конце, каждой строки какие-нибудь странные символы.

Только надо быть уверенным, что ваш редактор показывает специальные символы.

Например, редактор vi их показывает, а less — нет.

Многие современные текстовые редакторы предусматривают возможность задавать тип разделителей строк, поэтому проверьте, сохраняете ли вы файл в формате, подходящем для вашего Web-сервера.

Если вы пересылаете файлы на свой Web-сервер с помощью FTP, убедитесь в том, что ваш FTP-клиент настроен на пересылку файлов в текстовом (ASCII), а не в двоичном (binary) режиме. Во многих случаях это гарантирует автоматическое преобразование разрывов строк и помогает избежать проблем.

Ошибки доступа к файлам и интерпретатору Perl

Рекомендуем выводить ошибки интерпретатора Perl при тестировании работы скрипта в окно вашего браузера. Для установки данного режима, на время отладки, необходимо вписать в начале скрипта:

use CGI::Carp ‘fatalsToBrowser’;

Первая строка вашего скрипта должна указывать путь к интерпретатору Perl:

#!/usr/bin/perl

Убедитесь в отсутствии символа возврата каретки (код 0x0D) , в строках скрипта должен быть только символ перевода строки (код 0x0A). Права для CGI скриптов, а также для директории, содержащей скрипты, должны быть выставлены «-rwxr-xr-x», например такой командой:

chmod 755

Синтаксические ошибки

В Perl есть специальное средство, которое позволяет из командной строки проверять программу на наличие синтаксических ошибок, В Unix или Windows (с использованием командного процессора DOS) это делается путем ввода следующей строки на приглашение ОС:

perl -с .cgi

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

#can’t find string terminator ‘»‘ anywhere before EOF file ‘.cgi’; line 3

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

Закончив корректировку, попробуйте запустить программу из командной строки без применения ключа -с и посмотрите, выдаст ли она правильную стандартную информацию. (Это может быть HTML-страница ошибок, если программа ожидает ввода данных через форму.)

Примечание: Обязательно продолжайте тестирование по этой методике до тех пор, пока Perl не перестанет выдавать сообщения об ошибках. Некоторые ошибки могут скрываться другими; в этом случае Perl сообщит о скрытых ошибках только тогда, когда будут устранены все другие.

Ошибки конфигурации

Программу можно настроить, используя набор переменных конфигурации, которые определяются либо в начале программы, либо в отдельном файле конфигурации. Одни из этих переменных предназначены для конфигурирования опций программы, а другие указывают на местонахождение различных вспомогательных файлов. (Такой подход облегчает настройку поведения программы без внесения изменений в код).

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

Ошибки формата вывода

Последний тип ошибок, в отсутствии которых нужно убедиться перед вызовом программы из броузера, составляют ошибка формата вывода. Перед всей выходной информацией CGI-программы, предназначенной для Web-броузера посетителя ( т.е. перед всем, что выводится в STDOUT), должен идти правильный HTTP-заголовок, иначе будет сгенерирована ошибка «500 Server Error».

Например, если вы генерируете HTML-страницу, то первым выполняемым программой оператором print должен быть следующим:

print «Content-Type: text/htmlnn»;

Этот оператор выводит HTTP-заголовок, показывающий, что следующая за ним информация будет содержать HTML-страницу. Если вы не забудете в своей программе поставить эту строку (или соответствующий HTTP-заголовок при выводе не HTML-страницы) перед всеми остальными операторами print, то избежите любых ошибок формата вывода.

Ошибки в логике программы (использование Perl-отладчика)

Если вы проверили программу на наличие ошибок всех категорий, названных в предыдущих разделах, то у вас могут остаться только ошибки, относящиеся к логике программы. Есть два способа выявления такого рода ошибок: использование диагностических сообщений и применение Perl-отладчика.

Запуск отладчика

Если вы используете Perl под Unix или Windows (с командным процессором DOS), то отладчик запускается путем выполнения программы следующим образом:

perl -d program.cgi

Флаг -d дает Perl указание включить отладчик. Вы получите несколько сообщений, за которыми следует приглашение отладчика, выглядящее примерно так:

main::(.cgi:4): $test_file = «/home/web/test.html»; DB

В верхней строке сообщения отладчика выводится содержимое следующей исполняемой строки. Нижняя строка — это само приглашение; она дает вам знать, что отладчик готов к приему команд.

Как получить помощь

Команды отладчика состоят из одного или двух символов, за которыми иногда следует необязательный или обязательный аргумент.

Полный список этих команд можно получить путем ввода буквы h на приглашении отладчика и нажатия клавиши Enter.

Пошаговое прохождение программы

Основные команды отладчика позволяют обрабатывать программу по одной строке за раз. Если ввести на приглашение отладчика команду s и нажать клавишу Enter, то Perl выполнит следующую строку программы и выдаст новое приглашение.

Читайте также:
Программа упражнений для женщин в домашних условиях

Если ввести команду n и нажать клавишу Enter, то Perl сделает то же самое, но пропустит вызовы подпрограмм. (Команда s вводит вас в подпрограмму). Если вы использовали любую из этих команд хотя бы один раз, то для повторного ее вызова нужно просто нажать клавишу Enter.

Просмотр значений

В любой момент работы с отладчиком вы можете проверить значения переменных, Для этой цели имеется несколько методов.

Можно также применить стандартный оператор print, например print $var__name. В принципе, по приглашению отладчика можно использовать любой допустимый оператор языка Perl.

Поиск строк

Если вы уже проследили ошибку до конкретного сегмента программы, то, вероятно, хотите сразу же перейти в эту точку и начать поиск там. Отладчик предоставляет несколько способов перемещения внутри программы. Первый — это использование команды l, которая позволяет отображать номер конкретной строки. Например:

DB 1 180

Эта команда заставит отладчик вывести на экран строку 180. Опустив номер строки, на экран можно вывести группу строк. Можно также вывести диапазон строк:

DB 1 180-200

С помощью команды w можно вывести группу строк с текущей строкой или заданную строку в середине группы, чтобы поместить конкретную строку в контекст:

DB w 180

Эта команда выводит на экран группу строк со строкой 180 в середине. Если номер строки не указан, то используется номер текущей строки. Второй способ перехода в определенную точку программы — это стандартный поиск по образцу:

DB /$count/

Эта команда ищет в программе следующий экземпляр переменной Scount и переходит в строку, которая его содержит. (Закрывающую косую можно опустить).

Точки останова

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

DB b 180

Эта команда заставляет программу сделать паузу, когда она дойдет до строки 180. (Для запуска программы или возобновления ее после прерывания служит команда с). Вы можете также задать условие, которое должно быть выполнено для того, чтобы программа прервалась. Например:

DB to 180 $count > 5

Следующая команда заставит программу прерваться на строке 180, если значение переменной Scount больше 5.

Удаление контрольных точек производится с помощью команд d (удаляется одна контрольная точка) и D (удаляются все контрольные точки):

DB d 180

Выполнение дополнительных команд

Последняя из команд позволяет задавать действие, которое должно быть произведено в указанной строке без прекращения выполнения программы. Например:

DB a 180 print $count;

Эта команда заставит отладчик вывести текущее значение переменной $count непосредственно перед выполнением строки 180.

Отмена действий производится командой А (она отменяет все действия, которые вы установили для программы).

Имитация CGI-вызова

Perl-отладчик можно использовать с CGI-npoграммой. CGI-программы выполняются в удаленном режиме, поэтому доступа к отладчику не имеется. Тем не менее можно сымитировать CGI-вызов из самой программы, с тем чтобы с помощью отладчика следить за проблемами, возникающими только при CGI-вводе.

Установка переменных среды

Если ваша программа использует какие-либо переменные CGI-среды , то вы сможете модифицировать ассоциативный массив %ENV (Такие изменения носят временный характер и действуют на программу только тогда, когда она работает).

Это позволяет ввести в начало программы несколько строк, с помощью которых устанавливаются те переменные среды, которые она использует. Например:

$ENV = ‘100.100.100.100’; $ENV = ‘GET’; $ENV = ‘name=Myname+ID=123456’;

Имитация ввода данных формы

Еще одним элементом, нуждающимся в дублировании при имитации CGI-вызова, являются данные формы, которые передаются в программу. Если для передачи данных в форму используется метод GET, то сделать это достаточно легко. Метод передает данные формы в программу в переменной среды QUERY_STRING, поэтому нужно использовать что-нибудь похожее на две нижние строки приведенного выше примера.

При использовании метода POST ситуация усложняется лишь незначительно. Указанный метод передает в программу данные формы с помощью STDIN и задает количество передаваемых данных с помощью переменной среды CONTENT_LENGTH. Следовательно, для сбора данных можно использовать следующую CGI-программу:

#!/usr/bin/perl read(STDIN, $buffer, $ENV); open (OUT,»>path/to/form_data.txt»); print OUT $buffer;

Эта программа считает данные формы из STDIN, а потом запишет их в файл. Затем вы должны добавить в свою CGI-программу следующие строки:

$ENV = ‘POST’; $ENV = -s ‘/path/to/form_data.txt’;

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

perl -d .cgi < /path/to/form_data.txt
cat /path/to/form_data.txt | perl -d .cgi

Эти строки превращают запрос POST в запрос GET и считывают содержимое файла данных формы в переменную среды QUERY_STRING.

Как увидеть невидимое

Очень неприятен тот факт, что при выявлении логических ошибок в CGI-программе почти всегда генерируется сообщение «500 Server Error», которое ничего не скажет о происшедшем. Если программа генерирует ошибку «500», а вы не знаете почему, самый простой способ выявить проблему — заставить свой броузер вывести сообщение об ошибке.

Для этого нужно поставить следующие две строки в начало программы (сразу после строки #!/usr/bin/perl:

$| = 1; print «Content-type:text/plainnn»;

Первая строка дает Perl указание посылать всю выходную информацию прямо в броузер, не ожидая заполнения буфера. (Благодаря этому мы видим все, что выводит программа, и все, что выводит Perl в процессе выполнения программы).

Вторая строка сообщает броузеру о том, что все выводимое вашей программой в STDOUT должно рассматриваться как обычный текст и отображаться как таковой. Если эта строка есть, то при следующем вызове программы вы должны увидеть сообщение, которое приводит к выдаче сообщения об ошибке «500».

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

Так, если значение переменной $status должно быть равным 1, а вы подозреваете, что оно будет задано неверно, вставьте в точку, где эта переменная должна быть равной 1, следующую строку:

print «$status = $status»;

При следующем вызове программы вы увидите значение переменной $status у себя в броузере и сможете определить, в нем ли заключается причина возникшей проблемы. (По сути, вы выполняете в дистанционном режиме те же действия, которые обычно производятся в отладчике).

При более сложных ошибках этот метод работает достаточно медленно, но в отличие от других методов он все же работает.

Если ваша программа выполняет несколько функций, а проблема связана только с одной из них, вставьте в начало сегмента, вызывающего эту проблему, строку HTTP — заголовка. Это позволит вам пройти по нормальным сегментам как обычно и настроить все для обработки сегмента с ошибкой.

Источник: www.avahost.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru