我正在研究一个简单的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 :(得分: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();
}
我发现了另外两个问题同一个问题: