2016-06-17 5 views
1

Я пытаюсь поймать ошибку из моего класса JWT, но я не могу сделать это внутри класса, единственное место, которое я могу получить, это от моего основного вызывающего ,PHP не поймает ошибку внутри класса, только на вызывающем абоненте

Я звоню этот класс с ошибкой с моей «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); 
     } 
    } 
} 

И, наконец, у меня есть проблемы, класс пользователя, где я хочу, чтобы поймать ошибку, но это не будет работать:

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

Возможно, ваш класс 'User' находится в пространстве имен. Если это так, вам нужно «catch (\ Exception $ exception)». – bishop

+0

@bishop, который сработал, не может поверить, что это было так просто! не могли бы вы объяснить, почему это произошло как ответ, чтобы я мог его принять? Tks – Terkhos

+1

@ Джонатан: нет. PHP ленив загружен, и такие вещи, как «instanceof» и «catch», не будут проверять наличие интерфейсов, если они не нужны. Отлично подходит для производительности, но это может быть плохо для людей, которые не унифицируют обработку исключений. – Evert

ответ

2

Относительные имена классов (например, Exception в вашем примере) всегда привязаны к пространству имен, в котором вы находитесь. Если вы не определяете пространство имен, используется \. Рассмотрим:

<?php 
namespace Foo; 

use Vendor\Package\Bar; 

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

Здесь мы имеем два относительные пути класса: Bar и Exception. PHP разрешает Bar с помощью инструкции use на путь абсолютного класса \Vendor\Package\Bar. PHP не имеет оператора use, соответствующего Exception, поэтому PHP предполагает, что вы имеете в виду \Foo\Exception.

Очевидно, это не ваше намерение. К сожалению, PHP не работает, когда возникает такая ситуация. Меня это укусило несколько раз.