Вопрос по try catch throw

igortik

Новичок
Столкнулся с забавной ситуацией:

- есть зарегистрированный метод автозагрузчика:
PHP:
spl_autoload_register(array(__CLASS__, 'autoload'));
в нем строка кода:

PHP:
if($count < 2){
   throw new Exception('Wrong Class or Interface name: '.$fileName);
}
Ловит исключения Bootstrap.php:

PHP:
try{
...
}
catch (Exception $exception) {
 echo $exception->getMessage(), "\n";
}
Теперь самое главное - пытаемся создать ситуацию для исключения, пишем в пределах try { } Bootstrap.php такой вот код:
PHP:
NoneExistableClass::getInstance();
, теперь ясно, что, если класс не объявлен, то ситуация успешно контролируется автозагрузчиком, но там, почему-то, при успешном throw отдается не
PHP:
'Wrong Class or Interface name: '.$fileName
, как задумано, а банальная ошибка
PHP:
Fatal error: Class 'NoneExistableClass' not found in ...
Для уверенности ставил уже конструкцию die() до выброса исключения, работает, т.е. я не ошибаюсь с прохождением проверки на выброс исключения, но как только дело доходит до throw, то выдется классический Fatal Error, вместо моего текста.

Что еще удивительно, если инициируем ошибку не так
PHP:
NoneExistableClass::getInstance();
, а, например, так:
PHP:
$a = new NoneExistableClass();
, то исключение успешно проходит.

PHP: 5.3.2.
 

tz-lom

Продвинутый новичок
а нечего в автолоаде ошибки кидать, это раз
во вторых будь ты по внимательнее ты бы заметил что
Fatal error: Class 'NoneExistableClass' not found in ...
ололо , клаcс ошибки не объявлен xD

в общем и целом практика такая - ты не кидаешь ошибку а возвращаешь false , иначе ты запарываешь всю цепь автолоадов и делаешь всё слишком неочевидно работающим
так же тебе очень понравится эксепшн вываливающийся в любом месте кода
 

Koc

Новичок
в общем и целом практика такая - ты не кидаешь ошибку а возвращаешь false , иначе ты запарываешь всю цепь автолоадов и делаешь всё слишком неочевидно работающим
так же тебе очень понравится эксепшн вываливающийся в любом месте кода
не всегда и не везде
https://github.com/symfony/symfony/blob/master/src/Symfony/Component/ClassLoader/DebugUniversalClassLoader.php
 

igortik

Новичок
ну все-таки, где кидать исключение это дело проектирования, т.к. я не сказал, что в будущем они могут и будут вываливаться на экран :)
возможно, писать в лог и т.п.

Да и если там в методе будет 2 случая с false, то слишком неявно возвращать просто false ...

А что касается сути вопроса, то я так и не понял почему не работает корректно :/ Ведь я привел пример, когда исключение кидается корректно, стоит лишь вызвать статический метод без явного создания объекта и в этом случае исключение превращается в фатальную ошибку и не выполняет то, что нужно мне :/
 

tz-lom

Продвинутый новичок
ну я бы не сказал что разрывать цепочку автолоадов это хорошая практика, хотя конечно симфони в своём праве,всё таки фреймворк

igortik
суть в том что у тебя NoneExistableClass не объявлен и автолоадом не подгружен,а ты его выбросить пытаешься
 

igortik

Новичок
tz-lom
Наверное, я туплю или чего-то не знаю :)

Я бросаю исключение из контекста метода autoload загрузчика, для явности приведу другую проверку:
PHP:
if(!file_exists('NoneExistableClass.php')){throw new Exception('My Exception')}
При чем здесь тогда класс NoneExistableClass ?
 

tz-lom

Продвинутый новичок
да,это меня глюкануло

видно проблема в том что у тебя метод класса вызывается,и видать внутренности php на выброс исключения в этом месте не рассчитаны
вообщем говорил я выбрасывать исключение это плохая идея
 
Сверху