无法捕捉异常

时间:2012-06-20 18:21:05

标签: php exception

我正在研究一个简单的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

1 个答案:

答案 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();
} 

我发现了另外两个问题同一个问题:

PhpMailer throwing Fatal Exceptions

Facebook PHP SDK Throwing an Uncatchable OAuthException