2012-06-20 5 views
2

Я работаю над простой инфраструктурой MVC, и я использую автозагрузку классов, и я хочу использовать class_eixists(), чтобы проверить, существует ли имя контроллера, проанализированное из URI, и реагировать соответствующим образом. Я начал сИсключение уязвимости

$controller = "\\namespace\\controller"; 
if(class_exists($controller)) 
    $this->controllerObject = new $controller(); 
else 
    // react appropriately 

Это закончило тем, что выбрасывало исключение неперехваченной логики, если класс не существовал. Если мой google-fu не подвел меня, это обычное событие при использовании автозагрузки и функции class_exists(). Я не понял ничего сложного и завернул в попытку поймать, но я все еще получаю неперехваченное исключение, и я не вижу, что я делаю неправильно.

try { 
    if (class_exists($controller)) { 
     $this->controllerObject = new $controller(array_slice($parsedURI, 1)); 
     echo "controller is $controller<br />"; 
    } 
    } catch (LogicException $e) { 
    $e->getMessage(); 
    } catch (Exception $e) { 
    $e->getMessage(); 
    } 

Выход ошибки ниже. Строкой 57 является линия с (if (class_exists($controller))). Я изменил фактические пути вручную, потому что системный администратор параноик о том, что внутренняя информация становится общедоступной.

Fatal error: Uncaught exception 'LogicException' with message 'Class 
Controller\Gibberish could not be loaded' in  some/path/private/webroot/assets/route.php:57 Stack trace: #0 [internal function]: 
spl_autoload('Controller\Gibb...') #1 
some/path/private/app/webroot/assets/route.php(57): class_exists('\Controller\Gib...') 
#2 some/path/private/app/webroot/index.php(32): Assets\Route- 
>__construct('/add/webroot/...') #3 {main} thrown in 
some/path/private/app/webroot/assets/route.php on line 57 
+0

Что такое точное сообщение об ошибке? Здесь нет ничего исключающего *. Конечно, вы не просто получаете * Fatal Errors *? – deceze

+0

class_exists выкинет исключение –

+0

Я знаю, что это порождает исключение, проблема в том, что мой try/catch не поймал его. – Matt

ответ

3

Почти 2 часа поиска ответа до того, как я опубликую, и менее половины из них после этого, прежде чем найти ответ. Причина, по которой я не мог поймать исключение, состоит в том, что логика находится внутри метода класса, который находится внутри пространства имен. Чтобы поймать LogicException, он должен иметь префикс \, чтобы указать глобальное пространство имен.

try { 
    if (class_exists($controller)) { 
     $this->controllerObject = new $controller(array_slice($parsedURI, 1)); 
     echo "controller is $controller<br />"; 
    } 
} catch (\LogicException $e) { 
    $e->getMessage(); 
} 

Я нашел две другие вопросы с одинаковым вопросом:

PhpMailer throwing Fatal Exceptions

Facebook PHP SDK Throwing an Uncatchable OAuthException

+0

Лучшее решение, вот что я искал. –