4

这是我的代码的一部分:

// ... code ...
$action = self::defineAction( $request->getPath() );
try {
    $response = Controller::$action( $request );
} catch( \BadMethodCallException $exception ) {
    Logger::logError( $exception );
    $response = new NotFoundResponse();
}
// ... code ...

如果由于某种意外没有实现具有已定义名称的控制器的操作或名称定义错误,我会尝试捕获异常。

但是我没有捕获异常,而是在 Apache 的错误日志中得到了致命错误:

PHP Fatal error:  Call to undefined method app\\Controller::testingAction() ...

如果我尝试在控制器的现有(已定义和可调用)操作中调用未定义的方法,我也无法捕获上述异常 - 而是发生致命错误:

PHP Fatal error:  Call to undefined method app\\SomeClass::someUndefinedMethod() in /********/Controller.php on line *** ...

用“\Exception”替换“\BadMethodCallException”没有任何效果:我一直在获取致命错误。

将“try-catch”块放在控制器的每个动作中对我来说不是可接受的解决方案。

为什么不能以这种方式捕获异常?我怎么解决这个问题?

我正在运行 PHP 5.3.8。

4

1 回答 1

3

Catch 块只能捕获抛出的异常,不能捕获错误。Call to undefined method是一个错误,您需要对此进行测试并自己抛出异常。请参阅此处了解异常和错误之间的区别。

您可以通过执行以下操作来测试方法是否存在:

if( !method_exists('app\Controller', 'testingAction') ) {
    throw new \BadMethodCallException();
}
于 2012-11-21T13:43:30.540 回答