Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sanja v.2 08.07.2004 19:34 / 08.07.2004 21:28
Submission: предлагаю заменить кусок штатного auto.p из дистрибутива чем-то вроде:# Этот метод вызывается каждый раз, когда дела идут наперекосяк и Parser вылетает. @unhandled_exception[exception;stack] $response:status(500) $response:content-type[ $.value[text/html] $.charset[$response:charset] ] # Если обращение идёт с локального компьютера, посетитель получит подробное объяснение # про то, что произошло и где именно (вызывается @friendly_parser_error_message). # Если обращение идёт не со 127.0.0.1, выводится стандартный текст про Error 500 ^if($env:REMOTE_ADDR ne "127.0.0.1"){ $result[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"><head><title>Internal server error</title></head><body><H1>Internal server error</h1><p>Server encountered an internal error. Please inform the webmaster about this problem. If you are the webmaster, please edit the auto.p file to see error details. ^for[i](0;512/6){ ^;}</p></body></html>] }{ ^friendly_parser_error_message[$exception;$stack] } @friendly_parser_error_message[exception;stack] # В сообщениях об ошибках, которые генерирует Parser, фигурируют реальные пути к файлам # и папкам, что не есть хорошо. Вы можете указать в таблице $false_path вымышленное значение, на которое # будет заменяться часть пути. Если в вы выставите $hide_real_path в "no", или обращение # идёт с локального компьютера, замена делаться не будет. $hide_real_path[yes] ^if($env:REMOTE_ADDR eq "127.0.0.1" || $hide_real_path eq "no"){ $false_path[^table::create{from to}] }{ $false_path[^table::create{from to $env:DOCUMENT_ROOT /}] } $result[<?xml version="1.0" encoding="windows-1251"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <title>Internal server error</title> <style><!-- body {font-family: Arial, Geneva, Helvetica, sans-serif^;} h1 {font-size: 500%^; border-bottom: dotted 1px #ccc^; margin: 0^;padding: 0^; color: #900} li {list-style-type: square} //--></style> </head> <body> <H1>Ой…^;</h1> <h2>В работе Parser произошла ошибка:</h2> <pre>^untaint[html]{^exception.comment.replace[$false_path]}</pre> ^if(def $exception.source){ <h3>Ошибку вызвал этот фрагмент:</h3> <tt>^exception.source.replace[$false_path]</tt> ^if(def $exception.file){ <h3>Ошибка произошла при работе с файлом:</h3> <pre>^untaint[html]{<tt>^exception.file.replace[$false_path]</tt>, строка номер <b>$exception.lineno</b>}</pre> } } ^if(def $exception.type){ $parser_error_types[^table::create{type explanation parser.compile в вашем коде ошибка - вы забыли поставить пару какой-нибудь скобке, забыли поставить "птичку" перед знаком <b>^;</b> или ещё что-то. Будьте внимательнее. parser.runtime вы вызываете несуществующий метод (опечатка в имени или файл, в котором он лежит, недоступен?), методу передано неправильное количество параметров (нигде, часом, не забыли поставить "птичку" перед знаком <b>^;</b> где он не несёт специального значения?) или не тех типов, и т.п. Возможно, где-то опечатка в названии стандартной функции или в её использовании. Внимательно перепроверьте ваш код. parser.interrupted загрузка страницы прервалась (пользователь остановил загрузку страницы или истекло время ожидания). number.zerodivision вы пытаетесь заставить Parser поделить что-то на ноль, а он так не умеет. number.format вы пытаетесь преобразовать к числу нечисловые данные (например, "Людовик XIV" в "14" Parser преобразовать никогда не сумеет). file.missing вы пытаетесь получить доступ к файлу, которого нет или он на деле называется не так, как вы думаете (может быть, вы перепутали регистр? или заменили английскую букву в имени русской?) file.access у парсера нет прав на доступ к этому файлу. image.format файл изображения имеет неправильный формат (возможно, расширение имени не соответствует содержимому, или файл пуст?) sql.connect сервер баз данных не может быть найден или временно недоступен или же ему просто не нравятся ваши логин с паролем. sql.execute произошла ошибка исполнения SQL запроса. Там точно нет никаких опечаток? В таблице, к которой вы обращаетесь, есть все нужные столбцы? Может быть, база данных была повреждена? Или кончилось место на диске и сервер базы данных не может дальше правильно работать? xml в вашем коде XML ошибки, или вы пытаетесь выполнить над XML недопустимую операцию. smtp.connect SMTP сервер (сервер для отправки почты) не может быть найден или временно недоступен. smtp.execute произошла ошибка отправки письма по SMTP протоколу (проверьте, не "упал" ли сервер, принимает ли он от вас письма, и не вмешивается ли в процесс слишком бдительный антивирус). email.format у вас ошибка в email адресе: адрес пустой, содержит неправильные символы или же там попросту нет "@". email.send произошла ошибка запуска почтовой программы (у вас точно smtp/sendmail правильно работает? Спросите у администратора сервера или залезьте сами по SSH и проверьте, сымитировав отправку письма вручную). http.host искомый сервер не найден. Вы точно не сделали опечаток в имени, не выдернули шнур из сетевой карты, и не переусердствовали с настройкой файрволла? http.connect сервер, к которому вы обращаетесь, найден, но не принимает соединений. Может быть, слишком бдительный firewall или антивирус вмешиваются? http.response сервер, к которому вы обращаетесь, был найден, соединение принял, но выдал некорректный ответ (нет статуса, заголовка). Или это сетевая ошибка, или сбой "на той стороне". Соединитесь telent'ом с другим сервером и проверьте вручную, что на самом деле он выдаёт. http.status Cервер выдал ответ со статусом, не равным 200 (не успешное выполнение запроса). Может быть, статус - уже давно как "404 Page not found"? Если вам не важен статус ответа, попробуйте опцию any-status(1) http.timeout Parser не успел выкачать документ с HTTP-сервера в отведенное время. Попробуйте увеличить параметр timeout или сделать что-то с каналом связи с интернетом.}] } ^if(def $exception.comment){ $parser_faq[^table::create{code explanation expecting 'STRING' or '$^;' or '^^;' Как правило это не закрытые скобки или забытый префикс в виде символа ’^^;’ перед спецсимволами парсера ’^;’, ’^^;’, ’$^;’ и др. Если вы хотите, чтобы в тексте странички появился символ ’^;’ его надо написать так ’^^;^;’. В принципе, префиксы ставить нужно не всегда, однако если вы их поставите — хуже не будет) accepts minimum Это означает, что вы вызываете оператор и пытаетесь передать ему меньше параметров, чем тот требует для своего функционирования. Очень часто такая ошибка происходит, когда вы между скобками, разделяющими параметры, ставите пробелы/переводы строк. accepts maximum Это означает, что вы вызываете метод, и пытаетесь передать ему больше параметров, чем тот может принять. Очень часто такая ошибка происходит, когда вы передаете в метод строку, содержащую спецсимволы, вероятно, символ «точка с запятой», не предварив её символом «птичка». При этом парсер воспринимает этот символ как разделитель передаваемых в метод параметров. method_frame may not be overwritten Производится попытка добавить в тело страницы объект, который не может быть выведен парсером. Например, если написать в чистом поле ^^;date::now[] то получим такую ошибку. Чтобы вывести дату нужно сделать примерно следующее: <pre>$^;now[^^;date.now[]]<br />^^;now.sql-string[]</pre>Аналогично с объектами таблица, хеш и т.д. MAIN:CLASS_PATH were specified Вы пытаетесь использовать @USE или ^^;use[] но не задали переменную $^;MAIN:CLASS_PATH и персер не знает, где искать классы, которые вы пытаетесь подключить. Подробности в документации. not found along Файл с операторами или классами, которые вы пытаетесь подключить через @USE или ^^;use[] не найден по путям, указанным в переменной $^;MAIN:CLASS_PATH. Часто проблема имеет место быть, если после имени файла закрался пробел/символ табуляции. Также бывает, что после @USE и списка модулей забывают объявить метод и начинают писать код страницы, подразумевая, что это будет @main[] SQL:drivers table must be defined Не настроен или отсутствует конфигурационный auto.p (это тот, который у cgi версии лежит рядом с исполняемым файлом парсера). Для простой проверки скачайте из соответствующего раздела тестовый документ, распакуйте его в веб пространство вашего сайта и обратитесь к нему из броузера. Для того, чтобы данный файл смог все проверить, вам будет необходимо отредактировать конфигурационный auto.p и указать абсолютный путь в $^;confdir. driver implements API version Версия установленного и требуемого парсером драйвера (libparser3mysql.so) не совпадают. Причина может быть в том, что вы перешли с одной версии парсера на другую, но не обновили драйвер базы данных. outside of 'connect' operator Происходит попытка выполнить SQL запрос (^^;table::sql{}, ^^;int:sql{} и др.) вне оператора для подключения к БД ^^;connect[строка подключения]{запросы тут}. transcodeFromUTF8 error Тот кто настраивал вам parser или совсем не положил предлагаемый конфигурационный файл, или испортил его. По-умолчанию, если $^;request:charset не задан (сейчас подходящий момент посмотреть в документацию) он равен UTF-8. Parser’у не объяснили, в какой кодировке его документы ($^;request:charset), и он считает, что они в UTF-8. Соответственно, если попросить его перекодировать из UTF-8 в windows-1251 (определив $^;response:charset), задав на входе текст в windows-1251, он честно возмутится. endless loop detected Подобное сообщение появляется, если парсер обнаруживает очень длинный цикл. Например, если вы напишите конструкцию ^^;while(1){что-то} то будет подобное сообщение об ошибке. Кроме того, если вы сделаете большой цикл for или menu в котором будет более 10000 итераций, то тоже увидите подобное сообщение. endless recursion detected Подобное сообщение появляется, если парсеру кажется, что код зациклился. Очень часто причиной может быть некорректная или очень глубокая рекурсия (более 1000 вызовов).}] $faq_explanation[] ^parser_faq.menu{ ^if(^exception.comment.pos[$parser_faq.code] >= 0){ $faq_explanation[$parser_faq.explanation] } } } ^rem{### если текст ошибки упоминался в FAQ, выводим запись оттуда, если нет - более общий текст ###} ^if(!def $faq_explanation){ <h3>Что обычно приводит к ошибке $exception.type?</h3> ^if(^parser_error_types.locate[type;$exception.type]){ <p>^taint[as-is][$parser_error_types.explanation]</p> } }{ <h3>Вот что говорится в <a href="http://www.parser.ru/faq/">FAQ</a> об этой ошибке:</h3> <p>$faq_explanation</p> } ^if($stack){ <h3>Последовательность операций, которая привела к ошибке:</h3> (от самой последней вверху списка до самой первой внизу) <ul> ^stack.menu{ <li><tt>$stack.name</tt> ^stack.file.replace[$false_path] строка $stack.lineno </li> } </ul> } <h2>Ссылки:</h2> <ul> <li><a href="http://www.parser.ru/docs/">Документация по Parser</a></li> <li><a href="http://www.parser.ru/faq/">FAQ по Parser</a></li> </ul> ^for[i](0;512/6){ ^;} </body> </html>]А то люди в faq не ходят, так пускай он придёт к ним...