Php Can';无法捕获BadMethodCallException

Php Can';无法捕获BadMethodCallException,php,exception,try-catch,fatal-error,Php,Exception,Try Catch,Fatal Error,以下是我的代码部分: // ... code ... $action = self::defineAction( $request->getPath() ); try { $response = Controller::$action( $request ); } catch( \BadMethodCallException $exception ) { Logger::logError( $exception ); $response = new NotFound

以下是我的代码部分:

// ... 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 *** ...
将“\BadMethodCallException”替换为“\Exception”无效:我保留获取致命错误

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

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


我正在运行PHP5.3.8。

Catch块只能捕获抛出的异常,而不能捕获错误<代码>调用undefined方法是一个错误,您需要对此进行测试并自己抛出异常。查看异常和错误之间的差异

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

if( !method_exists('app\Controller', 'testingAction') ) {
    throw new \BadMethodCallException();
}

如果是这样,PHP本机“BadMethodCallException”类的特殊含义是什么?只能通过这种简单的方式抛出它吗?是的,它在PHP的SPL中,工作原理类似于
\Exception
,只允许您更具体地处理异常,而无需自己定义类。请注意,您可以设置一个错误处理程序,将PHP错误转换为异常。下面是一个关于