父类中抛出的异常未在子类中捕获

时间:2012-01-13 09:14:49

标签: php exception namespaces php-5.3

使用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>';
    } 
}

我收到“未捕获的OAuthException”错误。

为什么异常无法在子类中被捕获的任何想法?

3 个答案:

答案 0 :(得分:4)

我没有意识到这是一个问题,但这个类在命名空间中,所以我需要在我的Exception中添加一个“\”:

catch (\FacebookApiException $e)

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

答案 1 :(得分:0)

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);
    } 
}

答案 2 :(得分:0)

堆栈跟踪会更有帮助。 暂时尝试以下

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());
}

}