PHP不会在类中捕获错误,只能在调用者上捕获

时间:2016-06-17 00:03:05

标签: php error-handling

我试图从我的JWT课程中发现错误,但是我不能在课堂上做错,我唯一能得到它的地方是来自我的主要来电者。

我使用我的" API"中的错误来调用此类。我从路由开始:

$router = new Router();
$router->all('/users', function()
{
    $controller = new Controllers\UserController();

    $controller->start();
});

$router->run();

之后,我的控制器将调用我的" API"类:

class UserAPI extends BaseAPI
{
    protected $user;
    protected $apiBase = "user";

    function __construct($request, $origin)
    {
        parent::__construct($request);

        $this->user = new User();
    }

    protected function logout()
    {
        if( isset($this->request[$this->apiBase . 'Data']) )
        {
            return $this->usuario->login($this->request[$this->apiBase . 'Data']);
        }
        else
        {
            return Helpers::errorResponse("User data not informed", 200);
        }
    }
}

最后我遇到了问题,User类我想捕获一个错误,但它不会工作:

class User extends SimpleModel
{
    public function logout($userData)
    {
        try
        {
            //At this point i will get an error since the provided token is invalid on purpose
            $jwt = JWT::decode($userData['token'], SECRET_KEY, ['HS512']);
        }
        //Wont hit here even for a miracle
        catch (Exception $exception)
        {
            echo "Caught ExceptFoo\n";
            echo "Message: {$exception->getMessage()}\n";
        }
    }
}

唯一可以捕获此错误的地方是路由文件,这是我的index.php文件。

对于JWT课程我使用Firebase JWT

1 个答案:

答案 0 :(得分:2)

相对类名(如示例中的Exception)始终以您所在的命名空间为根。如果未定义命名空间,则使用\。考虑:

<?php
namespace Foo;

use Vendor\Package\Bar;

try {
    Bar::throwAnException();
} catch (Exception $ex) {
    die((string)$ex);
}

这里我们有两个相对的类路径:BarException。 PHP通过Bar语句将use解析为绝对类路径\Vendor\Package\Bar。 PHP没有与use对应的Exception语句,因此PHP 假定您的意思是\Foo\Exception

显然,这不是你的意图。不幸的是,当这种情况发生时,PHP是静默的。它被我咬了几次。