2012-01-13 46 views
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>'; 
    } 
} 

我收到一個「Uncaught OAuthException」錯誤。

任何想法爲什麼異常不能被抓到子類?

+0

你可以發表你的解決方案作爲回答,然後一對夫婦,你將被允許將其標記爲接受的天。 – shanethehat 2012-01-13 10:16:13

回答

4

我沒有意識到這是一個問題,但這個類是在一個命名空間,所以我需要添加一個「\」我的異常:

catch (\FacebookApiException $e) 

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

+0

我遇到了同樣的問題,當無法在名稱空間中的_child_類中捕獲異常,但它強烈cougt由父類。添加主導斜槓和它幫助,謝謝提示! – Hellbyte 2017-02-03 01:12:47

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

糟糕,我的函數實際上是覆蓋「api」(編輯後的原始文章反映),但我確實嘗試將其重命名爲「api_extended」,然後使用「$ this-> api」調用其他api方法 - 仍然是相同的錯誤。 而且我也嘗試了一般的異常想法。還是一樣的錯誤。 – derekbeau 2012-01-13 09:41:44

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

}

+0

仍然返回「Uncaught OAuthException」 - 我也嘗試了「catch(OAuthException $ e)」。沒有運氣。 – derekbeau 2012-01-13 09:44:10