2

我正在开发一个简单的 MVC 框架,我正在使用类的自动加载,我想用它class_eixists()来检查从 URI 解析的控制器名称是否确实存在并适当地响应。我从

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

如果类不存在,这最终会引发未捕获的逻辑异常。如果我的 google-fu 没有让我失望,那么这是使用自动加载和该class_exists()功能时的正常事件。我认为没什么大不了的,并将其包装在 try catch 中,但我仍然收到未捕获的异常,我看不出我做错了什么。

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
4

1 回答 1

3

在我发布之前搜索了将近 2 个小时的答案,之后不到一半的时间我找到了答案。我无法捕获异常的原因是因为逻辑位于命名空间内的类的方法内。为了捕获LogicException它,它必须以 a 为前缀\来指定全局命名空间。

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

我发现了另外两个具有相同问题的问题:

PhpMailer 抛出致命异常

Facebook PHP SDK 抛出无法捕获的 OAuthException

于 2012-06-20T19:08:27.817 回答