Исключение, брошенное в родительский класс, не пойманное в дочернем классе - PullRequest
3 голосов
/ 13 января 2012

Эта ошибка возникает при использовании Facebook PHP SDK, но я на самом деле думаю, что это общая ошибка.

Когда я запускаю этот код, все работает нормально, и ловится исключение:

$facebook = new Facebook('appId'=>APP_ID,'secret'=>APP_SECRET);
try {
    $user_profile = $facebook->api('/me','GET');
    echo "Name: " . $user_profile['name'];
} catch(FacebookApiException $e) {
    $login_url = $facebook->getLoginUrl(); 
    echo 'Please <a href="' . $login_url . '">login.</a>';
}

Но когда я запускаю этот код:

$facebook = new Facebook_Extended('appId'=>APP_ID,'secret'=>APP_SECRET);
$facebook->api_extended();

С методом расширенного класса, похожим на это:

// Overrides parent::api()
public function api() {
    try {
        $user_profile = parent::api('/me','GET');
        echo "Name: " . $user_profile['name'];
    } catch(FacebookApiException $e) {
        $login_url = $this->getLoginUrl(); 
        echo 'Please <a href="' . $login_url . '">login.</a>';
    } 
}

Я получаю ошибку "Uncaught OAuthException".

Есть идеи, почему исключение нельзя отследить в дочернем классе?

Ответы [ 3 ]

4 голосов
/ 13 января 2012

Я не осознавал, что это проблема, но этот класс находится в пространстве имен, поэтому мне нужно было добавить «\» в мое исключение:

catch (\FacebookApiException $e)

http://onehackoranother.com/logfile/2009/01/php-5-3-exception-gotcha

0 голосов
/ 13 января 2012

Трассировка стека будет более полезной. пока попробуйте следующее

public function api_extended() {
try {
    $user_profile = parent::api('/me','GET');
    echo "Name: " . $user_profile['name'];
} catch(FacebookApiException $e) {
    $login_url = $this->getLoginUrl(); 
    echo 'Please <a href="' . $login_url . '">login.</a>';
} catch (Exception $err){
    print_r($err->getTrace());
}

}

0 голосов
/ 13 января 2012

Метод api не является статичным, поэтому не следует использовать его следующим образом:

$user_profile = $this->api('/me','GET');

Если нет, вы всегда можете добавить еще один блок catch для общего исключения, чтобы увидеть, что происходит не так.

public function api_extended() {
    try {
        $user_profile = parent::api('/me','GET');
        echo "Name: " . $user_profile['name'];
    } catch(FacebookApiException $e) {
        $login_url = $this->getLoginUrl(); 
        echo 'Please <a href="' . $login_url . '">login.</a>';
    } catch(Exception $e) {
        var_dump($e);
    } 
}
...