[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: обработка исключений
Invis1ble
ООП начал изучать недавно. В качестве примера скачал гостевуху на ООП (автор Glock18). Вроде в общих чертах понимаю, однако возник вопросик:
в скрипте используется такая конструкция
if (!defined('GUESTBOOK'))
throw new Exception('Hack attempt in ' . __FILE__);

но она находится не в try-блоке. Далее можно увидеть это:
set_exception_handler(array('Base', 'ExceptionHandler'));

из чего я делаю вывод, что назначается функция для обработки неперехваченых исключений.
Сама функция:
public static function ExceptionHandler($exception)
{
echo $exception->getMessage();
}

Вот... Я пробовал проверить ее работу, при этом опера выдает следующее:

Fatal error: Uncaught exception 9;Exception' with message 'Hack attempt in C:\www\html\guest\private\index.php' in C:\www\html\guest\private\index.php:13 Stack trace: #0 {main} thrown in C:\www\html\guest\private\index.php on line 13

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



Спустя 59 минут, 13 секунд (22.08.2010 - 14:52) Guest написал(а):
это и есть обрыв исключения если оно не перехвачено

Спустя 15 минут, 22 секунды (22.08.2010 - 15:07) Invis1ble написал(а):
Guest это я итак понимаю. Прочти мой вопрос

Спустя 1 час, 48 минут, 12 секунд (22.08.2010 - 16:55) Invis1ble написал(а):
Неужели задумка автора состояла в том, чтобы возникала Fatal error?
ИМХО, логичнее было бы простой вывод сообщения в браузер, без fatal error... Думаю, в скрипте есть какая-то недоработка...

Спустя 1 час, 14 минут, 50 секунд (22.08.2010 - 18:10) vasa_c написал(а):
Цитата
Далее можно увидеть это:

Далее это где?

Спустя 7 минут, 5 секунд (22.08.2010 - 18:17) Invis1ble написал(а):
вот код, чтоб было понятно:
    if (!defined('GUESTBOOK'))
throw new Exception('Hack attempt in ' . __FILE__);

class Base
{
/**
*
@staticvar
* Синглтон приложения (Application).
*
*
@var Application
*/

private static $app = null;

/**
*
@static
* Функция создает объект приложения.
* Выбрасывает исключение, если приложение уже создано.
*/


public static function CreateApplication()
{
if (self::$app == null)
self::$app = new Application;
else
throw new Exception('Application is already created');
}

/**
*
@static
* Функция возвращает объект приложения.
* Выбрасывает исключение, если объект приложения еще не создан.
*
*
@return Application
*/


public static function App()
{
if (self::$app == null)
throw new Exception('Application is not yet created');

return self::$app;
}

/**
*
@static
* Функция для автозагрузки классов в PHP. Подключение в самом низу файла.
*
*
@param string $classname
*/


public static function Autoload($classname)
{
include MODULES_DIR . $classname . '.php';
}

/**
*
@static
* Функция для управления необработанными исключениями (если не был найден ниодин подходящий оператор catch).
*
*
@param Exception $exception
*/


public static function ExceptionHandler($exception)
{
// Here some logic may be placed, so we can process $exception data passed from throw operator
echo $exception->getMessage();
}

/**
*
@static
* Функция гарантирует, что в переданной строке будут экранированы все опасные символы для sql-запроса.
* Следует использовать на данных из массивов GET, POST и COOKIE.
*
*
@param string $string
*
@return string
*/


public static function EscapeAfterRequest($string)
{
if (get_magic_quotes_gpc())
return $string;

return mysql_real_escape_string($string);
}

/**
*
@static
* Функция устанавливает заголовок Location и завершает выполнение скрипта
* для того, чтобы немедленно перенаправить запрос.
*
*
@param string $location Url на который необходимо перенапривать запрос.
*/


public static function Redirect($location)
{
header('Location: ' . $location);
exit();
}
}


/**
* Функция устанавливает обработчик для автозагрузки классов.
* Подробнее смотреть на php.net.
*/


spl_autoload_register(array('Base', 'Autoload'));

/**
* Функция устанавливает обработчик для для неперехваченных во время выполнения скрипта исключений.
* Подробнее смотреть на php.net.
*/


set_exception_handler(array('Base', 'ExceptionHandler'));

Спустя 1 минута, 33 секунды (22.08.2010 - 18:19) vasa_c написал(а):
В какой последовательности выполнятся эти инструкции?

Спустя 6 минут, 21 секунда (22.08.2010 - 18:25) Invis1ble написал(а):
терзают меня смутные сомнения по поводу того, что функция определяется "после" выброса исключения... В этом причина? Если да, то как правильней сделать?

Спустя 3 минуты, 50 секунд (22.08.2010 - 18:29) vasa_c написал(а):
Очевидно - определять до.

Спустя 1 минута, 6 секунд (22.08.2010 - 18:30) Invis1ble написал(а):
я просто набираю в строке браузера страницу, например данный код находится в guest/midules/Base.php - вот если это набрать то выскакивает fatal error, хотя по идее я так понимаю должно просто сообщение выводиться "Hack attempt..." и завершаться скрипт

Спустя 1 минута, 22 секунды (22.08.2010 - 18:32) Invis1ble написал(а):
vasa_c
Цитата
Очевидно - определять до.

так а как в данном случае правильней сделать?

Спустя 1 минута, 31 секунда (22.08.2010 - 18:33) Invis1ble написал(а):
то есть функцию надо выдрать из класса и поставить ее до throw new Exception ?

Спустя 4 минуты, 30 секунд (22.08.2010 - 18:38) vasa_c написал(а):
Нет, но установить её в качестве обработчика прерываний очевидно нужно до выброса оного.

Спустя 17 минут, 17 секунд (22.08.2010 - 18:55) Invis1ble написал(а):
set_exception_handler(array('Base','ExceptionHandler'));

if (!defined('GUESTBOOK'))
throw new Exception('Hack attempt in '.__FILE__);

class Base
{
...

public static function ExceptionHandler()
{
echo $exception->getMessage();
}

...
}


Так?

P.S. Кстати насколько целесообразно использование в данном случае константы __FILE__ в плане безопасности?

Спустя 9 минут, 11 секунд (22.08.2010 - 19:04) vasa_c написал(а):
Цитата
Так?

Если заработало так, как надо, значит так.

Цитата
Кстати насколько целесообразно использование в данном случае константы __FILE__ в плане безопасности?

Внутри кода в плане безопасности никаких проблем.

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

Спустя 16 минут, 59 секунд (22.08.2010 - 19:21) Invis1ble написал(а):
vasa_c
Цитата
А показывать простым смертным пользователям исключения, ошибки и пути к файлам неправильно, как в плане безопасности, так и здравого смысла.

я так и думал.
Цитата
Если заработало так, как надо, значит так

заработать-то заработало, только самое интересное вот что: if (!defined('GUESTBOOK')) throw new Exception('Hack attempt ...'); вставлено в начало каждого файла... Т.е. получается, что файлы, в которые этот класс не включается, будут выдавать пресловутый fatal error ? Я правильно понимаю?

Спустя 9 минут, 6 секунд (22.08.2010 - 19:30) vasa_c написал(а):
GUESTBOOK - это не класс, это константа.

Видимо, все эти файлы подключаются из другого, в котором константа эта определена, а таким образом делается проверка на то, чтобы файл не запустили напрямую.

Спустя 5 минут, 22 секунды (22.08.2010 - 19:35) Invis1ble написал(а):
vasa_c
Цитата
GUESTBOOK - это не класс, это константа

это я понимаю. Я имею ввиду класс Base (в котором функция ExceptionHandler) подключается не ко всем файлам, а throw new Exception во всех файлах есть...

Спустя 13 часов, 10 минут, 28 секунд (23.08.2010 - 08:46) linker написал(а):
Это ахинея - автолоад класса запихан в конец файла, где определяется сам класс... Придется тебе во всех файлах, где определяются только классы и функции сносить нафиг не нужные
if (!defined('GUESTBOOK'))
throw new Exception('Hack attempt in ' . __FILE__);
. Удалять в конце всех таких файлов
set_exception_handler(array('Base', 'ExceptionHandler'));
в отдельный конфиг, туда же вынести
spl_autoload_register(array('Base', 'Autoload'));

Спустя 6 часов, 16 минут, 30 секунд (23.08.2010 - 15:02) Invis1ble написал(а):
linker
Я так понимаю, что скачаный мной сорс - далеко не лучший пример для изучения и тренировки unsure.gif ... Огромная просьба: дай какой-нибудь нормальный не слишком запутаный сорс, подходящий для изучения (желательно с комментариями).

Спустя 12 минут, 4 секунды (23.08.2010 - 15:14) linker написал(а):

Спустя 10 минут, 28 секунд (23.08.2010 - 15:25) Invis1ble написал(а):
linker
Спасибо. Только я имел ввиду, вообще, ООП-шный код какой-нибудь, типа гостевухи или что-нибудь в этом духе...

Спустя 2 минуты, 24 секунды (23.08.2010 - 15:27) linker написал(а):
К сожалению такового не имею, но почитать мануал и написать самому будет куда полезнее.

Спустя 6 минут, 56 секунд (23.08.2010 - 15:34) Invis1ble написал(а):
linker
да теорию я уже почитал, не только мануал. Хочется самому написать форум на ООП (я его уже писал на процедурках), а мне намного проще по примерам ориентироваться (наверно склад ума такой)...


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.