Прерывание выполнения скрипта

Rubin

Новичок
Прерывание выполнения скрипта

Всем привет. Есть такая проблема:

при вызове исключения catch отрабатывает свой код и завершает скрипт. Как можно продолжить скрипт без завершения?

Причем есть такая интересная особенность: файл с данной обработкой подключен инклудом к index.php, так вот вывод этого index.php продолжается нормально.

Код ( это происходит в любом throw ):

try
{
if ( !$account->accomplish_form($_REQUEST["id_form"]) )
throw new Exception("Уже отправлено.");

if( !isset($_REQUEST["name"]) OR strlen($_REQUEST["name"]) < 3) throw new Exception("Не задано название");

...

}
catch(Exception $e)
{
echo $e->getMessage()."&nbsp;";
}
 

Bakti9rov

!*|=?
Можно создать производный от Exception класс, там пусть при вызове catch выполняется код, который не завершает скрипт.

А вообще немного непонятно что вы имели ввиду под "прерыванием выполнения скрипта"..
 

Rubin

Новичок
Под "прерыванием выполнения скрипта" я имелл в виду что скрипт ведет себя так как будто в catch-е есть exit(); но как видите его там нет..... с учетом особенности для include, которую я описал выше
 

Bakti9rov

!*|=?
Rubin
catch выходит из ближайшего try-блока, так если в try-блок завернете всю программу, будет аналогично exit()
 

Rubin

Новичок
Автор оригинала: Bakti9rov
Rubin
catch выходит из всего try-блока, так если в try-блок завернете всю программу, будет аналогично exit()
Абсолютно согласен ... но у меня после catch блока идет большой кусок кода и этот кусок не выполняется

-~{}~ 02.08.07 18:46:

Автор оригинала: mishco
Rubin
Врешь, а врать не хорошо.
Обоснуй...

-~{}~ 02.08.07 18:47:

сейчас посмотрим что будет через set_error_handler
 

Bakti9rov

!*|=?
у меня после catch блока идет большой кусок кода
гыг, в РНР нет finally
Код:
этот кусок не выполняется
значит причина в другом, раз вы пишете что если файл с try-блоком подключается к индексному, то вывод продолжается нормально..
 

Rubin

Новичок
Вопрос: А в PHP вложенность блоков try как обрабатывается?

try
{
try
{
}
catch(...)
{
код1;
}
}
catch(...)
{
код2;
}

Может быть такое что исключение передается во внешний catch() хотя былосгенерировано во внутреннем try?
 

Bakti9rov

!*|=?
Rubin
управление передается ближайшему try-catch-блоку, внутри которого находится вызов исключения, примеры здесь.
 

Rubin

Новичок
В моем случае получается во внешний обработчик 1:


try
{
include("int.php");
}
catch(...)
{
обработчик 1
}



Внутри int.php:

try
{
throw ... // "прыгнет" в обработчик 1 :-(
}
catch(...)
{
обработчик 2
}


Кто подскажет как можно сделать?
 
Ты врешь, я только-что проделал то же самое, у меня вызывается "Обработчик 2". Так что собирай чехлы. Возможно в catch() ты указываешь класс Exception'а не тот который выбрасывает int.php.

-~{}~ 02.08.07 20:08:

Public.php
PHP:
	try
	{
		include 'Protected.php';
	}
	catch (Exception $object)
	{
		echo 'Обработчик 1';
	}
Protected.php
PHP:
	try
	{
		throw new Exception();
	}
	catch (Exception $object)
	{
		echo 'Обработчик 2';
	}
Вывод:
Обработчик 2
 
Сверху