2016-06-17 5 views
1

私はJWTクラスからエラーをキャッチしようとしていますが、クラス内でエラーをキャッチしようとしていますが、 。PHPはクラス内でクラス内のエラーをキャッチしません

私は、ルーティングで始まる私の「API」からのエラーでこのクラスを呼んでいる:

:私は私の「API」クラスを呼び出します私のコントローラを持っている。その後

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

    $controller->start(); 
}); 

$router->run(); 

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

おそらくあなたの 'User'クラスは名前空間にあります。もしそうなら、あなたは 'catch(\ Exception $ exception)'をしたいでしょう。 – bishop

+0

@ビショップは、それは働いた、それがこの単純だったと信じることができない!なぜそれが答えとして起こったのかを説明してください。私はそれを受け入れることができますか? Tks – Terkhos

+1

@ジョナサン:いいえ。 PHPは遅延ロードされており、 "instanceof"や "catch"のようなものは必要ない場合にはインタフェースの存在をチェックしません。パフォーマンスには優れていますが、例外処理をユニットテストしない人にとっては悪いことがあります。 – Evert

答えて

2

相対クラス名(例ではExceptionなど)は、常にあなたの名前空間に根ざしています。名前空間を定義しないと、\が使用されます。考えてみましょう:BarException

<?php 
namespace Foo; 

use Vendor\Package\Bar; 

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

は、ここでは2つの相対クラスパスを持っています。 PHPは、 useステートメントを介して Barを絶対クラスパス \Vendor\Package\Barに解決します。 PHPは Exceptionに対応する useステートメントを持っていませんので、 \Foo\Exceptionを意味するものとします。

明らかに、これはあなたの意図ではありません。残念ながら、このような状況が発生した場合、PHPは無音です。それは私を数回噛んだ。

関連する問題