| PARSER | FAQ | Парсерные сообщения об ошибках |

Как увидеть сообщение об ошибке? Я вижу лишь «Unhandled Exception»… Как говорится в , при обнаружении парсером необработанной ошибки вызывается метод , который по умолчанию определен в конфигурационном auto.p , входящим в поставку парсера. Для того, чтобы кто ни попадя не видел текстов об ошибке, из метода , который лишь сообщает, что произошла ошибка (Unhandled Exception), и для её уточнения предлагает заглянуть в parser3.log или включить debug режим, чтобы текст сообщения об ошибке выдавался на страницу. Для того, чтобы включить этот debug режим, необходимо отредактировать конфигурационный auto.p таким образом, чтобы из метода находится в этом файле). …parser already configured… вызывается повторно. Этот метод должен присутствовать только в конфигурационном auto.p (который находится рядом с исполняемым файлом). Необходимо проверить: — не вызывается ли через use конфигурационный auto.p …expecting 'STRING' or '$' or '^'… Как правило это не закрытые скобки или забытый префикс в виде символа ’^’ перед парсера ’;’, ’^’, ’$’ и др. Если вы хотите, чтобы в тексте странички появился символ ’;’ его надо написать так ’^;’. В принципе, префиксы ставить нужно не всегда, однако если вы их поставите — хуже не будет ;) …method of MAIN (MAIN) accepts minimum XX parameter(s)… Это означает, что вы вызываете оператор и пытаетесь передать ему меньше параметров, чем тот требует для своего функционирования. Очень часто такая ошибка происходит, когда вы между скобками, разделяющими параметры, ставите пробелы/переводы строк. …method of MAIN (MAIN) accepts maximum XX parameter(s)… Это означает, что вы вызываете метод, и пытаетесь передать ему больше параметров, чем тот может принять. Очень часто такая ошибка происходит, когда вы передаете в метод строку, содержащую , вероятно, символ «точка с запятой», не предварив её символом «птичка». При этом парсер воспринимает этот символ как разделитель передаваемых в метод параметров. …method_frame may not be overwritten with table/date/hash, store it to variable instead… Производится попытка добавить в тело страницы объект, который не может быть выведен парсером. Например, если написать в чистом поле то получим такую ошибку. Чтобы вывести дату нужно сделать примерно следующее: ^now.sql-string[] Аналогично с объектами таблица, хеш и т.д. …no $MAIN:CLASS_PATH were specified… и парсер не знает, где искать классы, которые вы пытаетесь подключить. Подробности в  . Одна из возможных причин: переменная $MAIN:CLASS_PATH определена в конфигурационном auto.p, однако по каким-либо причинам на вашей системе он не выполняется. В поиске данной проблемы вам может помочь тестовый документ, скачанный из . Другая возможная причина: вы пытаетесь подключить классы раньше, чем определили переменную $MAIN:CLASS_PATH. Такое обязательно произойдет если вы в корневом auto.p будете подключать дополнительные файлы в @USE, а определять упоминаемую переменную будете в методе @auto[], который выполняется после @USE. …not found along MAIN:CLASS_PATH… Файл с операторами или классами, которые вы пытаетесь подключить через или не найден по путям, указанным в переменной . Часто проблема имеет место быть, если после имени файла в @USE закрался пробел/символ табуляции. Также бывает, что после и списка модулей забывают объявить метод и начинают писать код страницы, подразумевая, что это будет …$SQL:drivers table must be defined… auto.p (это тот, который у cgi версии лежит рядом с исполняемым файлом парсера). Для простой проверки скачайте из  тестовый документ, распакуйте его в веб пространство вашего сайта и обратитесь к нему из броузера. Для того, чтобы данный файл смог все проверить, вам будет необходимо отредактировать конфигурационный auto.p . …driver failed to initialize client library '/path/to/libparser3mysql.so'… libparser3mysql.so это не клиентская библиотека MySQL, а драйвер парсера. Вам в таблице драйверов нужно указать путь к этому драйверу и libmysqlclient.so . Местоположение драйвера вам известно (вы его сами копировали на сервер), а местоположение клиентской библиотеки вам может подсказать администратор вашего сервера если оно отличается от общепринятого. …driver failed to initialize client library '/path/to/libmysqlclient.so'… libmysqlclient.so не увенчалась успехом. Вам нужно узнать у вашего системного администратора полный дисковый путь к этому драйверу и прописать его в таблицу в главном конфигурационном файле. …driver implements API version 0xXXXX not equal to 0xYYYY… libparser3mysql.so ) не совпадают. Причина может быть в том, что вы перешли с одной версии парсера на другую, но не обновили драйвер базы данных. …undefined protocol 'XYZ'… (например 'mysql') В главном конфигурационном файле (auto.p который находится рядом с парсером) не определен протокол, который вы пытаетесь использовать в операторе …outside of 'connect' operator… , и др.) вне оператора для . …transcodeFromUTF8 error… Тот кто настраивал вам parser или совсем не положил предлагаемый конфигурационный файл, или испортил его. По-умолчанию, если не задан (сейчас подходящий момент в документацию) он равен UTF-8. Parser’у не объяснили, в какой кодировке его документы ( ), и он считает, что они в UTF-8. Соответственно, если попросить его перекодировать из UTF-8 в windows-1251 (определив ), задав на входе текст в windows-1251, он честно возмутится. Подобное может случиться если по каким либо причинам парсер не считывает конфигурационный auto.p, что можно проверить разместив в последнем или проанализировав в корневом auto.p какие-либо настройки, заданные в конфигурационном файле. …'USE ' invalid special name. valid names are 'CLASS', 'USE' and 'BASE'… После @USE закрался невидимый символ пробела/табуляции, который можно заметить, если приглядеться к тексту в первых одинарных кавычках. Удалите его, сразу после @USE должен быть символ перевода строки. …endless loop detected… Подобное сообщение появляется, если парсер обнаруживает очень длинный цикл. Например, если вы напишите конструкцию то будет подобное сообщение об ошибке. Кроме того, если вы сделаете большой цикл в котором будет более 20000 итераций, то тоже увидите подобное сообщение. …call canceled - endless recursion detected… Подобное сообщение появляется, если парсеру кажется, что код зациклился. Очень часто причиной может быть некорректная или очень глубокая рекурсия (более 1000 вызовов). …SIGPIPE received. … parser3.log , при этом вроде все работает нормально. Что это означает? Когда ответ от CGI-скрипта больше клиенту веб-сервера не нужен, например пользователь нажал кнопку stop, или потерялась связь, веб-сервер посылает скрипту сигнал «послушай, тут твой output больше никому не нужен». В версиях parser до 3.0.0006 этот сигнал специально не обрабатывался, и происходила его обработка по-умолчанию = убивание процесса посередине его работы [исключение составлял parser, соединившийся с oracle, там oracle библиотека включала игнорирование этого сигнала]. Это нехорошо, что нас убивали, и мы ничего не могли аккуратно закрыть. С версии 3.0.0007 parser отлавливает этот сигнал и создаёт ошибку « ». В том случае, если до обработки запроса ещё дело не дошло, или, наоборот, запрос уже обработан, в лог и попадёт приведённая вами запись. …post_size(XX) != content_length(YY)… Ошибка означает следующее: от броузера посетителя на сервер пришёл POST запрос, в заголовке которого написано однако попытки считать это количество байт из stdin CGI процесса не увенчались успехом — было считано только XX байт. Если подобная ошибка изредка встречается в parser.log, то можно просто не обращать на неё внимания, возможно в процессе POST-а данных от посетителя с нестабильным соединением произошел его разрыв и до сервера просто не дошла часть данных. Однако если каждый POST вызывает эту ошибку то проблема с настройками сервера. …posted content_length(XXXX) > max_post_size(YYYY)… Кто-то через форму на вашем сайте попытался закачать на сервер файл размером XXXX байт, в то время как у вас в главном конфигурационном файле , что серверу разрешено принимать файлы с максимальным размером YYYY байт. …unknown mode, must be 'append'… Обычно такая ошибка возникает когда вы записываете содержимое переменной на диск и думаете что переменная содержит файл, а на самом деле в переменной — строка (например забыли написать нужный enctype у формы и пытаетесь загрузить файл на сервер). Для решения проблемы просто сделайте перед записью проверку на тип переменной. Дело в том что и у строки и у файла есть метод save, но он принимает разные параметры. …invalid HTTP response status… и удаленный сервер в заголовке ответа вернул статус не равный 200, что для парсера является ошибкой. Если вам нужно иное поведение парсера и вы желаете самостоятельно разобраться с ответом укажите в параметрах $.any-status(1) как сказано в  . …out of memory… Вашему коду для выполнения потребовалось памяти больше, чем ему позволил занимать системный администратор. Для решения этой проблемы вам потребуется оптимизировать код (убрать , не загружать большие объемы данных, периодически обнулять переменные и выполнять , изменить логику работы кода) или попросить вашего администратора увеличить лимит памяти процессу. из . …exception in request exception handler… Данная ошибка означает, что вы допустили ошибку в методе , который как раз и должен сообщать об ошибках. PAF , что начиная с версии 3.1.4 даже если вы допустите ошибку в этом методе парсер все равно внятно о ней сообщит. У меня парсер назначен обработчиком файлов с расширением html, в  .htaccess ErrorDocument 404 /404.html . Однако если я набираю в строке броузера путь к несуществующему файлу с расширением html, то вместо того, чтобы увидеть файл /404.html я вижу сообщение парсера об ошибке. Файлы с другими расширениями отрабатывают нормально. Как быть? Вы всегда можете перехватить исключение парсера "file.missing" и сами отобразить вместо несуществующего документа документ /404.html . Можно изменить метод @unhandled_exception[exception;stack] ^if(^env:REMOTE_ADDR.match[^^IP адрес вас как разработчика]){ ^unhandled_exception_debug[$exception;$stack] }{ ^if($exception.type eq "file.missing"){ ^rem{*** если нет файла то делаем внутренний ***} ^rem{*** редирект на страницу с 404 ошибкой ***} ^rem{*** не забывая написать в ней $response:status(404) ***} $response:location[/404.html] }{ ^unhandled_exception_release[$exception;$stack] } }

Hosted by uCoz