parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

@friendly_unhandled_exception + 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){&nbsp^;}</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>Ой&#133^;</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 '&#36^;' or '&#94^;'	Как правило это не закрытые скобки или забытый префикс в виде символа ’&#94^;’ перед спецсимволами парсера ’^;’, ’&#94^;’, ’&#36^;’ и др. Если вы хотите, чтобы в тексте странички появился символ ’^;’ его надо написать так ’&#94^;^;’. В принципе, префиксы ставить нужно не всегда, однако если вы их поставите — хуже не будет)
accepts minimum	Это означает, что вы вызываете оператор и пытаетесь передать ему меньше параметров, чем тот требует для своего функционирования. Очень часто такая ошибка происходит, когда вы между скобками, разделяющими параметры, ставите пробелы/переводы строк.
accepts maximum	Это означает, что вы вызываете метод, и пытаетесь передать ему больше параметров, чем тот может принять. Очень часто такая ошибка происходит, когда вы передаете в метод строку, содержащую спецсимволы, вероятно, символ «точка с запятой», не предварив её символом «птичка». При этом парсер воспринимает этот символ как разделитель передаваемых в метод параметров.
method_frame may not be overwritten	Производится попытка добавить в тело страницы объект, который не может быть выведен парсером. Например, если написать в чистом поле &#94^;date::now[] то получим такую ошибку. Чтобы вывести дату нужно сделать примерно следующее: <pre>&#36^;now[&#94^;date.now[]]<br />&#94^;now.sql-string[]</pre>Аналогично с объектами таблица, хеш и т.д.
MAIN:CLASS_PATH were specified	Вы пытаетесь использовать @USE или &#94^;use[] но не задали переменную &#36^;MAIN:CLASS_PATH и персер не знает, где искать классы, которые вы пытаетесь подключить. Подробности в документации.
not found along	Файл с операторами или классами, которые вы пытаетесь подключить через @USE или &#94^;use[] не найден по путям, указанным в переменной &#36^;MAIN:CLASS_PATH. Часто проблема имеет место быть, если после имени файла закрался пробел/символ табуляции. Также бывает, что после @USE и списка модулей забывают объявить метод и начинают писать код страницы, подразумевая, что это будет @main[]
SQL:drivers table must be defined	Не настроен или отсутствует конфигурационный auto.p (это тот, который у cgi версии лежит рядом с исполняемым файлом парсера). Для простой проверки скачайте из соответствующего раздела тестовый документ, распакуйте его в веб пространство вашего сайта и обратитесь к нему из броузера. Для того, чтобы данный файл смог все проверить, вам будет необходимо отредактировать конфигурационный auto.p и указать абсолютный путь в &#36^;confdir.
driver implements API version	Версия установленного и требуемого парсером драйвера (libparser3mysql.so) не совпадают. Причина может быть в том, что вы перешли с одной версии парсера на другую, но не обновили драйвер базы данных.
outside of 'connect' operator	Происходит попытка выполнить SQL запрос (&#94^;table::sql{}, &#94^;int:sql{} и др.) вне оператора для подключения к БД &#94^;connect[строка подключения]{запросы тут}.
transcodeFromUTF8 error	Тот кто настраивал вам parser или совсем не положил предлагаемый конфигурационный файл, или испортил его. По-умолчанию, если &#36^;request:charset не задан (сейчас подходящий момент посмотреть в документацию) он равен UTF-8. Parser’у не объяснили, в какой кодировке его документы (&#36^;request:charset), и он считает, что они в UTF-8. Соответственно, если попросить его перекодировать из UTF-8 в windows-1251 (определив &#36^;response:charset), задав на входе текст в windows-1251, он честно возмутится.
endless loop detected	Подобное сообщение появляется, если парсер обнаруживает очень длинный цикл. Например, если вы напишите конструкцию &#94^;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){&nbsp^;}
	</body>
</html>]
А то люди в faq не ходят, так пускай он придёт к ним...