【问题标题】:Can't catch BadMethodCallException无法捕获 BadMethodCallException
【发布时间】:2012-11-09 18:32:04
【问题描述】:

这是我的代码的一部分:

// ... 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。

【问题讨论】:

    标签: php exception try-catch fatal-error


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果是,PHP原生的“BadMethodCallException”类有什么特殊含义?只能用这种直截了当的方式扔吗?
    • 是的,它在 PHP 的 SPL 中并且工作方式类似于 \Exception,只是允许您更具体地处理您的异常,而无需自己定义类,take a look at this
    • 请注意,您可以设置一个错误处理程序,将 PHP 错误转换为异常。这是converting errors to exceptions 上的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2012-08-08
    • 2011-03-14
    • 2012-03-15
    • 2014-11-25
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多